String 在[Char]和[Word8]之间转换的最佳方式?
我是Haskell的新手,我正在尝试在我的应用程序中使用纯SHA1实现(String 在[Char]和[Word8]之间转换的最佳方式?,string,unicode,haskell,utf-8,String,Unicode,Haskell,Utf 8,我是Haskell的新手,我正在尝试在我的应用程序中使用纯SHA1实现(Data.Digest.pure.SHA)和JSON库(AttoJSON) AttoJSON使用Data.ByteString.Char8bytestrings,SHA使用Data.ByteString.Lazybytestrings,我的应用程序中的一些字符串文本是[Char] 似乎表明这是哈斯克尔语言/前奏曲中仍在解决的问题 列出了一些图书馆,但已经有几年历史了 当前在这些类型之间进行转换的最佳方式是什么?有哪些折衷方案
Data.Digest.pure.SHA
)和JSON库(AttoJSON
)
AttoJSON使用Data.ByteString.Char8
bytestrings,SHA使用Data.ByteString.Lazy
bytestrings,我的应用程序中的一些字符串文本是[Char]
似乎表明这是哈斯克尔语言/前奏曲中仍在解决的问题
列出了一些图书馆,但已经有几年历史了
当前在这些类型之间进行转换的最佳方式是什么?有哪些折衷方案
谢谢 Char8和normalbytestring是同一件事,只是根据您导入的模块使用不同的接口。您主要希望在strict和lazy bytestring之间进行转换,为此您使用
toChunks
和fromChunks
要将字符放入bytestring,请使用pack
另外请注意,如果您的字符包含在UTF-8中表示多字节的代码点,则会出现问题。对于字符8和字8之间的转换,您应该能够使用toEnum/fromEnum转换,因为它们表示相同的数据 对于字符和字符串,您可能可以使用Data.ByteString.Char8.pack/unpack或map、toEnum和fromnum的某种组合,但如果您使用的是ASCII以外的任何东西,则会抛出数据 对于可能包含不止ASCII的字符串,一个流行的选择是UTF8编码。我喜欢utf8字符串包:
也许您想这样做:
import Data.ByteString.Internal (unpackBytes)
import Data.ByteString.Char8 (pack)
import GHC.Word (Word8)
strToWord8s :: String -> [Word8]
strToWord8s = unpackBytes . pack
这里是我所拥有的,没有使用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
S.unpack
在ByteString提供的[Word8]上,我们应用(chr.fromEnum)
将任何枚举类型转换为字符。通过将它们组合在一起,我们将实现我们想要的功能 注意:这回答了一个非常特殊的问题(在硬编码字符串上调用函数)
这似乎是一个小问题,因为转换函数的存在在前面的答案中有详细说明。
但是我想要一种减少管理代码的方法,也就是说,为了让函数协同工作而必须编写的代码
减少字符串类型处理代码的解决方案是使用OverloadedStrings
pragma并导入相关模块
注意:myWordList类型由编译器推断
- 如果不在bslHandling中使用它,那么上面的声明将是一个经典的
类型[Char]
- 它不能解决从一个特定类型传递到另一个特定类型的问题
如果Char和Word8是相同的,希望它能有所帮助
import Data.Word ( Word8 )
import Unsafe.Coerce ( unsafeCoerce )
toWord8 :: Char -> Word8
toWord8 = unsafeCoerce
strToWord8 :: String -> Word8
strToWord8 = map toWord8
请注意,
Char
无法安全地转换为Word8
,因为Char
可以存储比Word8
多得多的值。考虑到Haskell对Unicode的支持,这是一个非常糟糕的假设。不安全被称为不安全,正是因为这样。事实上,雅各布·王的答案要好得多。
import Data.Word ( Word8 )
import Unsafe.Coerce ( unsafeCoerce )
toWord8 :: Char -> Word8
toWord8 = unsafeCoerce
strToWord8 :: String -> Word8
strToWord8 = map toWord8