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é