快速,优化的UTF8编码解码

时间:2014-10-26 16:19:53

标签: haskell unicode encoding utf-8 ghc

您是否知道使用一些额外信息对UTF8进行编码和解码的最快方法?以下是我遇到的有趣案例:

序列化

我只想对不透明的缓冲区进行编码而不进行验证,以便稍后再解码。最快的是使用底层内存缓冲区,并以某种方式不安全地将它从Text强制转换为ByteString而不触及内容。

可能是ASCII

我想99%的时间我的UTF8实际上是ASCII,因此有必要先做一次确认,并且如果发现它不是真的那么只进行进一步的处理。

可能不是ASCII

与之前相反。

可能很短

JSON中的单个密钥或数据库,我猜是1到20个字符。愚蠢地支付一些前期成本,如矢量化SIMD方法。

可能很长

HTML文档。值得为最高吞吐量支付一些前期费用。

还有一些类似的变体,如编码JSON或URL,你认为可能没有转义字符。

我在[Haskell]标签下问这个问题,因为Haskell的强类型使得一些技术变得容易,比如C很难实现。此外,可能会有一些特殊的GHC技巧,比如在英特尔平台上使用SSE4指令会很有趣。但这通常是一个UTF8问题,好的想法对任何语言都有帮助。

更新

经过一些研究后,我建议实施encodedecode以进行序列化,如下所示:

myEncode :: Text -> ByteString
myEncode = unsafeCoerce
myDecode :: ByteString -> Text
myDecode = unsafeCoerce

如果您喜欢段错误,这是个好主意......

1 个答案:

答案 0 :(得分:4)

这个问题涉及一系列广泛的问题。我将把它解释为"在Haskell中,我应该如何在Unicode和其他字符编码之间进行转换?"

在Haskell中,转换为Unicode和从Unicode转换的推荐方法是使用text-icu中的函数,它提供了一些basic functions

fromUnicode :: Converter -> Text -> ByteString
toUnicode :: Converter -> ByteString -> Text

text-icu是对International Components for Unicode libraries的绑定,它对非Unicode字符集的编码和解码进行了繁重的处理。其网站提供了有关conversion in general的文档以及有关how its converter implementations operate的一些具体信息。请注意,不同的字符集需要稍微不同的转换器实现。

ICU也可以attempt to automatically detect the character set of an input。 "这至多是使用统计数据和启发式算法的不精确操作。"没有其他实施可以修复"那个特点。 Haskell绑定不会像我写的那样暴露该功能;见#8

我不知道用本机Haskell编写的任何字符集转换过程。正如ICU文件所示,存在很多复杂性;毕竟,这是一个丰富的国际计算历史领域。

效果

作为ICU FAQ laconically notes,"大多数时候,硬盘和RAM的内存吞吐量是主要的性能限制。"虽然该评论并非专门针对转换,但我也希望它在广泛的情况下也是如此。不然的是你的经历吗?

unsafeCoerce不合适。