2011-02-11 75 views
3

“龅”的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。

+1

ruby​​的版本对unicode问题很重要,因为1.9有更好的工具。 – 2011-02-11 05:15:26

回答

3

应该使用UNICODEBING//为目标编码

irb(main):014:0> Iconv.iconv("UNICODEBIG//","utf-8","龅")[0].each_byte {|b| puts b.to_s(16)} 
9f 
85 
=> "\237\205" 
4

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 

这是一个长长的名单,所以我不会在这里添加它。

4

你可以试试这个:

“%04X” % “龅” .unpack( “U *”)[0]

=>“9f85”