2011-02-11 59 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」