在Latin1编码的Data.ByteString和Data.Text之间转换

hvr*_*hvr 5 haskell character-encoding latin1

由于latin-1(又名ISO-8859-1)字符集嵌入Unicode字符集中作为其最低的256个代码点,我希望转换是微不足道的,但我没有看到任何拉丁语-1编码转换函数,Data.Text.Encoding其中仅包含常见UTF编码的转换函数.

Data.ByteString在latin-1表示和Data.Text值中编码的值之间进行转换的推荐和/或有效方法是什么?

ham*_*mar 13

答案就在您链接的页面顶部:

要访问更大的编码系列,请使用以下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]
Run Code Online (Sandbox Code Playgroud)

但是,正如您所指出的,在latin-1的特定情况下,代码点与Unicode重合,因此您可以使用pack/ unpackfrom Data.ByteString.Char8从latin-1执行简单的映射String,然后您可以将其转换为Text使用对应pack/ unpack来自Data.Text.

  • 不满足于从`ByteString`转换为`Text`的当前选项我终于编写了一个执行接近最优的直接转换,并且不在其API中公开`IO` monad,请参阅https:// github. COM/BOS /文字/拉/ 18 (2认同)