2011-09-25 13 views
5

Poiché il set di caratteri latin-1 (ovvero ISO-8859-1) è incorporato nel set di caratteri Unicode come i suoi 256 punti di codice più bassi, mi aspetto che il la conversione è banale, ma non ho visto alcuna funzione di conversione di codifica latin-1 in Data.Text.Encoding che contiene solo funzioni di conversione per le codifiche UTF comuni.Conversione tra Latin1-encoded Data.ByteString e Data.Text

Qual è il modo consigliato e/o efficace per convertire tra valori Data.ByteString codificati in rappresentazione latin-1 e valori Data.Text?

+1

A proposito, l'ipotesi che "poiché il set di caratteri latin-1 è incorporato nel set di caratteri Unicode come i suoi 256 punti di codice più bassi, mi aspetterei che la conversione sia banale" è ingiustificato. Non c'è motivo di aspettarsi che i bytest risultanti dalla codifica di un singolo stream di codice sorgente in due codifiche differenti debbano avere una relazione banale tra loro. –

+0

@DanielWagner: Sì, sono consapevole che nel caso generale non dovrei aspettarmelo (per esempio se 'Data.Text' usava utf8 come rappresentazione Unicode interna), ma la versione corrente di' Data.Text' libreria usa la rappresentazione UTF16, per cui la conversione da latin1 è in realtà una conversione banale che consiste nell'inserire zero ottetti prima o dopo (a seconda che UTF16LE o UTF16BE sia richiesto) ogni ottetto latin1. – hvr

risposta

13

La risposta è proprio in cima alla pagina si è collegato:

Per accedere a una molto più grande famiglia di codifiche, utilizzare il pacchetto text-icu: http://hackage.haskell.org/package/text-icu

Un esempio veloce 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] 

Tuttavia, come lei ha sottolineato, nel caso specifico di latin-1, i punti di codice coincidono con Unicode, in modo da poter utilizzare pack/unpack da Data.ByteString.Char8 per eseguire la mappatura banale dal latin-1 da/per String, che è quindi possibile convertire in Text utilizzando il corrispondente pack/unpack da Data.Text.

+2

non essendo soddisfatto delle opzioni correnti per convertire da 'ByteString' a' Text' ho finalmente codificato una conversione diretta che si comporta in modo quasi ottimale e non espone il monade 'IO' nella sua API, vedi https: // github .com/bos/text/tirare/18 – hvr

Problemi correlati