【问题标题】:Convert Between Latin1-encoded Data.ByteString and Data.Text在 Latin1 编码的 Data.ByteString 和 Data.Text 之间转换
【发布时间】:2011-09-25 10:23:52
【问题描述】:

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

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

【问题讨论】:

  • 顺便说一句,“由于 latin-1 字符集作为其最低 256 个代码点嵌入在 Unicode 字符集中,我希望转换是微不足道的”的假设是没有根据的.没有理由期望以两种不同的编码方式对单个代码点流进行编码所产生的字节流彼此之间应该存在微不足道的关系。
  • @DanielWagner:是的,我知道在一般情况下我不应该期望这种情况(例如,如果Data.Text 使用 utf8 作为其内部 Unicode 表示),但当前版本的Data.Text 库使用 UTF16 表示,从 latin1 转换实际上是一个简单的转换,包括在每个 latin1 八位字节之后或之前(取决于是否需要 UTF16LE 或 UTF16BE)插入零八位字节。

标签: haskell character-encoding latin1


【解决方案1】:

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

要访问更大的编码系列,请使用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.Char8 中的pack/unpack 来执行来自 latin-1 的简单映射从/到String,然后您可以使用来自Data.Text 的相应pack/unpack 将其转换为Text

【讨论】:

  • 对当前从ByteString 转换为Text 的选项不满意我终于编写了一个直接转换,它执行近乎最佳并且不会在其API 中公开IO monad ,见github.com/bos/text/pull/18
猜你喜欢
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2013-04-03
  • 2011-07-14
  • 2011-05-11
  • 2013-11-27
  • 2020-09-15
相关资源
最近更新 更多