2011-02-11 4 views
3

UTF-8 «龅» - E9BE85, а юникод - U + 9F85. Следующий код не работал должным образом:конвертировать utf-8 в unicode в ruby ​​

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

Версия рубина важна для вопросов в Юникоде, поскольку у 1.9 есть намного лучшие инструменты. –

ответ

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"

Смежные вопросы