Подтвердить что ты не робот

Ruby 1.9: Преобразование байтового массива в строку с многобайтовыми символами UTF-8

Я пытаюсь найти способ в 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 с многобайтовыми символами и преобразовать его обратно в строку?

Спасибо.

4b9b3361

Ответ 1

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

irb(main):010:0> [67, 97, 102, 195, 169].pack('C*').force_encoding('utf-8')
=> "Café"

Ответ 2

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

ar = 'Café'.codepoints.to_a
# => [67, 97, 102, 233]
ar.pack('U*')
# => Café