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

5
由于 Latin-1 (也称为 ISO-8859-1) 字符集嵌入到 Unicode 字符集中作为其最低的 256 个代码点,因此我希望转换很简单,但是在 Data.Text.Encoding 中没有看到任何 Latin-1 编码转换函数,该库仅包含常见 UTF 编码的转换函数。

有没有推荐或有效的方法可以在 Latin-1 表示和 Data.Text 值之间进行转换?


1
顺便提一下,“由于Latin-1字符集嵌入到Unicode字符集中作为其最低的256个代码点,所以我期望转换是微不足道的”这种假设是没有根据的。没有理由期望在两种不同编码中编码单个代码点流产生的字节流之间存在微不足道的关系。 - Daniel Wagner
@DanielWagner:是的,我知道在一般情况下不应该期望这样(例如如果Data.Text使用utf8作为其内部Unicode表示),但是当前版本的Data.Text库使用UTF16表示,因此从latin1转换实际上是一个微不足道的转换,只需在每个latin1八位字节之后或之前(取决于需要UTF16LE还是UTF16BE)插入零八位字节即可。 - hvr
1个回答

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]

然而,正如你所指出的,在 latin-1 的特定情况下,代码点与 Unicode 相符,因此您可以使用来自 Data.ByteString.Char8pack/unpack 执行从 latin-1 到/从 String 的简单映射,然后将其转换为 Data.Text 中相应的 pack/unpack,即可将其转换为 Text


2
对于从 ByteString 转换为 Text 的当前选项不满意,我最终编写了一种直接转换的方法,它执行效果接近最优,并且在其 API 中不暴露 IO monad,请参见 https://github.com/bos/text/pull/18。 - hvr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接