在Ruby中将UTF-8转换为Unicode

3

"龅"的UTF-8编码是E9BE85,Unicode编码为U+9F85。以下代码未按预期工作:

irb(main):004:0> "龅"
=> "\351\276\205"
irb(main):005:0> Iconv.iconv("unicode","utf-8","龅").to_s
=> "\377\376\205\237"

附注:我正在使用Ruby1.8.7。


1
Ruby的版本对于Unicode问题非常重要,因为1.9版本有更好的工具。 - Michael Papile
3个回答

4

Ruby 1.9+比1.8.7更擅长处理Unicode,因此,如果可能的话,强烈建议使用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"


该代码的作用是将汉字“龅”转换成16进制编码“9f85”。

3

建议使用UNICODEBIG//作为目标编码

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接