конвертировать utf-8 в юникод в ruby - PullRequest
3 голосов
/ 11 февраля 2011

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

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

PS: я использую Ruby1.8.7.

Ответы [ 3 ]

4 голосов
/ 01 июня 2011

Вы можете попробовать это:

"% 04x"% "龅" .unpack ("U *") [0]

=> "9f85"

4 голосов
/ 11 февраля 2011

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

Это длинный список, поэтому я не буду добавлять его сюда.

3 голосов
/ 11 февраля 2011

Следует использовать UNICODEBING// в качестве целевой кодировки

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