2011-09-25 41 views
5

Dado que el conjunto de caracteres latin-1 (también conocido como ISO-8859-1) está incrustado en el conjunto de caracteres Unicode como 256 puntos de código más bajos, esperaría que la conversión es trivial, pero no vi ninguna función de conversión de codificación latin-1 en Data.Text.Encoding que contenga solo funciones de conversión para las codificaciones UTF comunes.Convertir entre Data.ByteString y Data.Text codificado en Latin1

¿Cuál es la forma recomendada y/o eficiente para convertir entre Data.ByteString valores codificados en representación latin-1 y valores Data.Text?

+1

Por cierto, la suposición de que "dado que el conjunto de caracteres latin-1 está incrustado en el conjunto de caracteres Unicode como sus 256 puntos de código más bajos, espero que la conversión sea trivial" no está justificada. No hay ninguna razón para esperar que las corrientes secundarias resultantes de la codificación de una única secuencia de punto de código en dos codificaciones diferentes tengan una relación trivial entre sí. –

+0

@DanielWagner: Sí, soy consciente de que, en el caso general, no debería esperar esto (por ejemplo, si 'Data.Text' usó utf8 como representación interna de Unicode), pero la versión actual de' Data.Text' la biblioteca usa representación UTF16, para la cual la conversión de latin1 es de hecho una conversión trivial que consiste en insertar cero octetos después o antes (dependiendo de si se requiere UTF16LE o UTF16BE) cada octeto latin1. – hvr

Respuesta

13

La respuesta está justo en la parte superior de la página enlazada:

Para acceder a una familia mucho más grande de codificaciones, utilice el text-icu paquete: http://hackage.haskell.org/package/text-icu

Un ejemplo rápido GHCi :

λ> import Data.Text.ICU.Convert 
λ> conv <- open "ISO-8859-1" Nothing 
λ> Data.Text.IO.putStrLn $ toUnicode conv $ Data.ByteString.pack [198, 216, 197] 
ÆØÅ 
λ> Data.ByteString.unpack $ fromUnicode conv $ Data.Text.pack "ÆØÅ" 
[198,216,197] 

Sin embargo, como usted señaló, en el caso específico de latin-1, los puntos de código coinciden con Unicode, y lo puede utilizar pack/unpack de Data.ByteString.Char8 para llevar a cabo el mapeo trivial del latín-1 desde/hasta String, que luego se puede convertir a Text usando el correspondiente pack/unpack de Data.Text.

+2

no estoy satisfecho con las opciones actuales para convertir de 'ByteString' a' Text' Finalmente codifiqué una conversión directa que funciona casi óptima y no expone la mónada 'IO' en su API, consulte https: // github .com/bos/text/pull/18 – hvr

Cuestiones relacionadas