ruby unicode utf-8

Ruby 1.9: Convierte una matriz de bytes a una cadena con caracteres UTF-8 multibyte



encoding ruby (2)

Estoy tratando de encontrar una manera en Ruby de tomar una matriz de bytes UTF-8 y transformarla de nuevo en una cadena.

En irb (Ruby 1.9.2 preview 3) puedo crear la matriz de bytes correcta desde la cadena UTF-8:

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

Sin embargo, no puedo encontrar una forma de ida y vuelta de bytes a una matriz. Intenté usar Array.pack con la opción U *, pero eso no funciona para los 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 multibyte y convertirla de nuevo en una cadena?

Gracias.


Esto tiene que ver con cómo el pack interpreta sus datos de entrada. La 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 empaca los bytes e interpreta como UTF-8:

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


Usted pregunta específicamente acerca de 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é