Преобразование между кодированными латинскими данными Data.ByteString и Data.Text - PullRequest
5 голосов
/ 25 сентября 2011

Поскольку набор символов latin-1 (он же ISO-8859-1) встроен в набор символов Unicode как его самые низкие 256 кодовых точек, я ожидал бы, что преобразование будет тривиальным, но я не видел ни одногофункции преобразования кодировки latin-1 в Data.Text.Encoding, которые содержат только функции преобразования для общих кодировок UTF.

Какой рекомендуемый и / или эффективный способ преобразования между значениями Data.ByteString, закодированными влатинское-1 представление и Data.Text значения?

1 Ответ

13 голосов
/ 25 сентября 2011

Ответ находится в верхней части страницы, на которую вы ссылаетесь:

Чтобы получить доступ к гораздо большему семейству кодировок, используйте пакет text-icu: http://hackage.haskell.org/package/text-icu

Краткий пример 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]

Однако, как вы указали, в конкретном случае latin-1 кодовые точки совпадают с Unicode, поэтому вы можете использовать pack /unpack из Data.ByteString.Char8, чтобы выполнить тривиальное отображение из латиницы-1 из / в String, которое затем можно преобразовать в Text, используя соответствующий pack / unpack из Data.Text.

...