2010-08-14 16 views
8

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

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

不过,我得到运行时异常:

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

是否有可能呢?我使用的是Ruby 1.8.6。

回答

12

您已将文件保存为UTF-16LE编码,一个Windows误导性地称为“Unicode”。通常最好避免这种编码,因为它不是ASCII超集:每个代码单元存储为两个字节,其中ASCII字符的另一个字节存储为\0。这会混淆很多软件;将UTF-16用于文件存储是很不寻常的。

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

Ruby 1.8完全是基于字节的;它不会尝试从脚本读取Unicode字符。所以你只能以ASCII兼容的编码保存源文件。通常情况下,您希望将文件保存为UTF-8(不含BOM; UTF-8人造BOM是另一项突破一切的微软创新)。这对于生成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应用程序的语言”中选择),但它的编号为从未使用 UTF-8。这个设置又被误导地称为ANSI代码页。

因此,如果您使用的是日文Windows安装,则您的控制台编码将是Windows代码页932(Shift-JIS的一种变体)。如果是这样的话,你可以使用“ANSI”或明确的“日语cp932”从文本编辑器中保存文本文件,当你在Ruby中运行它时,你会得到正确的字符。同样,如果你想使源经受misencoding,你无法逃脱字符串中CP932编码:

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

但是,如果你在其他语言环境的机器上运行它,它会产生不同的字符。在Western Windows安装(代码页1252)上,您将无法将日语写入Ruby的默认控制台。 (虽然Ruby 1.9改进了Unicode的处理,但它并没有改变任何东西,它仍然是一个基于字节的应用程序,使用C标准库IO功能,这意味着它仅限于Windows的本地代码页)。

+3

这是unicode人在行动 – mykhal 2010-08-14 16:50:01

相关问题