String 在[Char]和[Word8]之间转换的最佳方式?

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] 似乎表明这是哈斯克尔语言/前奏曲中仍在解决的问题 列出了一些图书馆,但已经有几年历史了 当前在这些类型之间进行转换的最佳方式是什么?有哪些折衷方案

我是Haskell的新手,我正在尝试在我的应用程序中使用纯SHA1实现(
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