我的应用程序需要处理一些国际字符,即ä,ü,ö和ß,它们仍然是ascii。
当我在处理这些字符时测试ruby的行为时,我收到了这个错误:
test.rb:1: invalid multibyte char (US-ASCII)
test.rb:1: invalid multibyte char (US-ASCII)
代码:
puts "i like my chars: ä, ü, ö and ß!"
但奇怪的是:当使用交互式Ruby Shell时,我没有收到任何错误!
编辑:在我的应用程序中,我正在从外部api中检索数据。上面的代码只是一个例子!
答案 0 :(得分:11)
不,这些字符在ASCII中不是。 ASCII没有任何高于Unicode U + 007F(十进制127)的值。有关详细信息,请参阅wikipedia ASCII entry。
我怀疑交互式Ruby shell采用shell的本机编码,而不是ASCII。
您是否有办法指定.rb文件的编码?如果是这样,请使用 - 或更改脚本,使其真正 ASCII。
答案 1 :(得分:8)
将魔术评论# coding: utf-8
放在脚本的开头(如果你使用的是shebang,则放在第二行)。
#!/usr/local/bin/ruby
# coding: utf-8
puts "i like my chars: ä, ü, ö and ß!"
答案 2 :(得分:1)
那些不是ASCII字符......它们恰好仍然在一些传统的ASCII派生字符集中以一个字节编码。最有可能发生的事情是您的源文件被保存为UTF-8,因为它包含非ASCII字符,并且ruby正确地处理了这个。
您只是在交互式提示下使用它,因为您的终端正在使用一些传统的字符编码。
答案 3 :(得分:0)
要转义ASCII编码的字符,请使用Unicode转义序列:
puts "i like my chars: \u00E4, \u00FC, \u00F6 and \u00DF!"
Ruby 1.9,无论如何 - 我不记得这是否适用于1.8。
答案 4 :(得分:0)
对我有用的是删除shebang行并直接从macosx下的ruby19运行脚本:
GreyJewel:Moralytics atma$ head -n1 moralytics
**# coding: utf-8**
GreyJewel:Moralytics atma$ which ruby
/opt/local/bin/ruby
GreyJewel:Moralytics atma$ ruby --version
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11]
GreyJewel:Moralytics atma$ ruby moralytics
Το λεξικό που χρησιμοποιούμε έχει: 407117 λέξεις
Το λεξιλόγειο του χρήστη atmat εμπεριέχει: 3943 λέξεις συνολικά.
那很有用。使用shebang会导致错误。我无法确定原因。
答案 5 :(得分:0)