在[Char]和[Word8]之间进行转换的最佳方式是什么?

cma*_*232 11 string unicode haskell utf-8

我是Haskell的新手,我正在尝试在我的app(Data.Digest.Pure.SHA)中使用一个带有JSON库(AttoJSON)的纯SHA1实现.

AttoJSON使用Data.ByteString.Char8字节Data.ByteString.Lazy串,SHA使用字节串,我的应用程序中的一些字符串文字是[Char].

Haskell Prime关于Char类型的维基页面似乎表明这仍然是在Haskell语言/ Prelude中得到解决的问题.

我这篇文章的Unicode支持列出了一些图书馆,但它的一对夫妇岁.

目前在这些类型之间进行转换的最佳方法是什么,以及有哪些权衡?

谢谢!

Jac*_*ang 6

这是我所拥有的,没有使用 ByteString 的内部函数。

import Data.ByteString as S (ByteString, unpack)
import Data.ByteString.Char8 as C8 (pack)
import Data.Char (chr)

strToBS :: String -> S.ByteString
strToBS = C8.pack

bsToStr :: S.ByteString -> String
bsToStr = map (chr . fromEnum) . S.unpack
Run Code Online (Sandbox Code Playgroud)

S.unpack在 ByteString 上给我们 [Word8],我们应用(chr . fromEnum)它将任何 Enum 类型转换为字符。通过将它们组合在一起,我们就得到了我们想要的功能!


scl*_*clv 2

Char8 和普通字节串是相同的东西,只是根据导入的模块具有不同的接口。主要是您想要在严格字节串和惰性字节串之间进行转换,为此您使用toChunksfromChunks

要将字符放入字节串中,请使用pack.

另请注意,如果您的字符包含以 UTF-8 表示的多字节表示的代码点,则会出现问题。