Ruby 脚本中的 Unicode 字符?

2023-11-24

我想编写一个 Ruby 脚本,将日语字符写入控制台。例如:

puts "こんにちは・今日は"

但是,我在运行时遇到异常:

jap.rb:1: Invalid char `\377' in expression
jap.rb:1: Invalid char `\376' in expression

可以做吗?我正在使用 Ruby 1.8.6。


您已使用 UTF-16LE 编码保存文件,Windows 错误地称其为“Unicode”。通常最好避免这种编码,因为它不是 ASCII 超集:每个代码单元存储为两个字节,ASCII 字符的另一个字节存储为\0。这会让很多软件感到困惑;使用 UTF-16 进行文件存储并不常见。

你所看到的\377 and \376(八进制为\xFF and \xFE) 是放在 UTF-16 文件前面的 U+FEFF 字节顺序标记序列,用于区分 UTF-16LE 和 UTF-16BE。

Ruby 1.8 完全基于字节;它不会尝试从脚本中读取 Unicode 字符。因此,您只能以 ASCII 兼容的编码保存源文件。通常,您希望将文件保存为 UTF-8(无 BOM;UTF-8 假 BOM 是 Microsoft 的另一项伟大创新,它打破了一切)。这对于在 Web 上生成 UTF-8 页面的脚本非常有用。

如果您想确保源代码能够以任何 ASCII 兼容的编码保存,您可以对字符串进行编码以使其更具弹性(如果可读性较差):

puts "\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe3\x83\xbb\xe4\xbb\x8a\xe6\x97\xa5\xe3\x81\xaf"

然而!写入控制台本身就是一个大问题。用于将字符发送到控制台的编码因平台而异。在 Linux 或 OS X 上,它是 UTF-8。在 Windows 上,每个安装区域设置都有不同的编码(在“区域和语言选项”控制面板条目中的“非 Unicode 应用程序的语言”中选择),但它是neverUTF-8。此设置再次被误导为 ANSI 代码页。

因此,如果您使用日语 Windows 安装,您的控制台编码将为 Windows 代码页 932(Shift-JIS 的变体)。如果是这种情况,您可以使用“ANSI”或明确的“日语 cp932”从文本编辑器保存文本文件,当您在 Ruby 中运行它时,您将得到正确的字符。同样,如果您想让源代码能够承受错误编码,您可以使用 cp932 编码对字符串进行转义:

puts "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd\x81E\x8d\xa1\x93\xfa\x82\xcd"

但是,如果您在另一个区域设置的计算机上运行它,它将产生不同的字符。您将无法在西方 Windows 安装(代码页 1252)上从 Ruby 将日语写入默认控制台。

(虽然 Ruby 1.9 极大地改进了 Unicode 处理,但它并没有改变任何东西。它仍然是一个使用 C 标准库 IO 函数的基于字节的应用程序,这意味着它仅限于 Windows 的本地代码页。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 脚本中的 Unicode 字符? 的相关文章

随机推荐