“龅”的UTF-8是E9BE85,Unicode是U + 9F85。以下代码没有按预期工作:将utf-8转换为ruby中的unicode
irb(main):004:0> "龅"
=> "\351\276\205"
irb(main):005:0> Iconv.iconv("unicode","utf-8","龅").to_s
=> "\377\376\205\237"
P.S:我正在使用Ruby1.8.7。
“龅”的UTF-8是E9BE85,Unicode是U + 9F85。以下代码没有按预期工作:将utf-8转换为ruby中的unicode
irb(main):004:0> "龅"
=> "\351\276\205"
irb(main):005:0> Iconv.iconv("unicode","utf-8","龅").to_s
=> "\377\376\205\237"
P.S:我正在使用Ruby1.8.7。
应该使用UNICODEBING//
为目标编码
irb(main):014:0> Iconv.iconv("UNICODEBIG//","utf-8","龅")[0].each_byte {|b| puts b.to_s(16)}
9f
85
=> "\237\205"
Ruby 1.9+处理Unicode比1.8.7好得多,所以我强烈建议尽可能在1.9.2下运行。
问题的一部分是1.8不明白UTF-8或Unicode字符可能超过一个字节长。 1.9确实理解并介绍了像String#each_char之类的东西。
require 'iconv'
# encoding: UTF-8
RUBY_VERSION # => "1.9.2"
"龅".encoding # => #<Encoding:UTF-8>
"龅".each_char.entries # => ["龅"]
Iconv.iconv("unicode","utf-8","龅").to_s # =>
# ~> -:8:in `iconv': invalid encoding ("unicode", "utf-8") (Iconv::InvalidEncoding)
# ~> from -:8:in `<main>'
要获得有关语言Iconv可用编码的列表,这样做:
require 'iconv'
puts Iconv.list
这是一个长长的名单,所以我不会在这里添加它。
你可以试试这个:
“%04X” % “龅” .unpack( “U *”)[0]
=>“9f85”
ruby的版本对unicode问题很重要,因为1.9有更好的工具。 – 2011-02-11 05:15:26