2010-12-13 11 views
20

Estoy intentando encontrar una forma en Ruby de tomar una matriz de bytes UTF-8 y transformarla en una cadena.Ruby 1.9: Convertir matriz de bytes a cadena con caracteres UTF-8 de varios bytes

En IRB (Rubí 1.9.2 previsualización 3) Puedo crear la matriz de bytes correcta de UTF-8 cadena:

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

Sin embargo, no puedo encontrar una manera de ida y vuelta desde bytes de nuevo a una formación. Intenté usar Array.pack con la opción U *, pero eso no funciona para caracteres multibyte.

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

¿Alguien sabe una manera de tomar una matriz de bytes UTF-8 con caracteres de varios bytes y volver a convertirlo en una cadena?

Gracias.

Respuesta

29

Esto tiene que ver con cómo pack interpreta sus datos de entrada. El U* en su ejemplo hace que convierta los datos de entrada (se supone que están en un conjunto de caracteres predeterminado, supongo, realmente no pude encontrar ninguna documentación de esto) a UTF-8, por lo tanto, la codificación doble. En su lugar, simplemente empacar los bytes e interpretar como UTF-8:

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

El código funciona como un encanto. Esto hizo mi dia. ¡Gracias! – Charlie

8

le preguntas específicamente sobre una matriz de bytes, pero tal vez los puntos de código son más adecuados:

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

Podría usar eso en otro proyecto, pero para este empiezo con la matriz de bytes y tengo que volver a la cadena. – Charlie

Cuestiones relacionadas