Ruby 1.9: преобразование байтового массива в строку с многобайтовыми символами UTF-8 - PullRequest
21 голосов
/ 13 декабря 2010

Я пытаюсь найти способ в Ruby взять массив байтов UTF-8 и преобразовать его обратно в строку.

В irb (Ruby 1.9.2 preview 3) я могу создать правильный байтовый массив из строки UTF-8:

ruby-1.9.2-preview3 > 'Café'.bytes.to_a
 => [67, 97, 102, 195, 169]

Однако я не могу найти способ возврата из байтов обратно в массив. Я пытался использовать Array.pack с опцией U *, но это не работает для многобайтовых символов.

ruby-1.9.2-preview3 > [67, 97, 102, 195, 169].pack('U*')
 => "Café"

Кто-нибудь знает способ взять массив байтов UTF-8 с многобайтовыми символами и преобразовать его обратно в строку?

Спасибо.

Ответы [ 2 ]

32 голосов
/ 13 декабря 2010

Это связано с тем, как pack интерпретирует свои входные данные. U* в вашем примере приводит к преобразованию входных данных (предполагается, что они находятся в наборе символов по умолчанию, я полагаю; я действительно не смог найти никакой документации по этому поводу) в UTF-8, таким образом двойное кодирование. Вместо этого просто упакуйте байты и интерпретируйте как UTF-8:

irb(main):010:0> [67, 97, 102, 195, 169].pack('C*').force_encoding('utf-8')
=> "Café"
8 голосов
/ 13 декабря 2010

Вы специально спрашиваете о байтовом массиве, но, возможно, кодовые точки больше подходят:

ar = 'Café'.codepoints.to_a
# => [67, 97, 102, 233]
ar.pack('U*')
# => Café
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...