文本或字节串

Dfr*_*Dfr 76 string text haskell

美好的一天.

我现在讨厌Haskell的一件事是用于处理字符串的数量.

首先我使用了原生的Haskell [Char]字符串,但是当我尝试开始使用hackage库时,完全失去了无休止的转换.每个包似乎都使用不同的字符串实现,有些采用自己手工制作的东西.

接下来我用Data.Text字符串和OverloadedStrings扩展名重写了我的代码,我选择了Text因为它有更广泛的功能集,但似乎很多项目更喜欢ByteString.
有人可以简短推理为什么要使用其中一个?

PS:顺便想怎么转换TextByteString

无法匹配期望类型 Data.ByteString.Lazy.Internal.ByteString 对抗推断类型文本 预期类型:IO Data.ByteString.Lazy.Internal.ByteString推断类型:IO文本

我试过encodeUtf8Data.Text.Encoding,但没有运气:

无法匹配期望类型 Data.ByteString.Lazy.Internal.ByteString 对抗推断类型Data.ByteString.Internal.ByteString

UPD:

谢谢你的回复,*Chunks的善良看起来像是要走的路,但我对结果感到有些震惊,我原来的功能看起来像这样:

htmlToItems :: Text -> [Item]
htmlToItems =
    getItems . parseTags . convertFuzzy Discard "CP1251" "UTF8"
Run Code Online (Sandbox Code Playgroud)

现在成了:

htmlToItems :: Text -> [Item]
htmlToItems =
    getItems . parseTags . fromLazyBS . convertFuzzy Discard "CP1251" "UTF8" . toLazyBS
    where
      toLazyBS t = fromChunks [encodeUtf8 t]
      fromLazyBS t = decodeUtf8 $ intercalate "" $ toChunks t
Run Code Online (Sandbox Code Playgroud)

是的,这个函数不起作用,因为它的错误,如果我们提供Text它,那么我们相信这个文本已经正确编码并准备使用并转换它是愚蠢的事情,但这样一个冗长的转换仍然需要采取放在外面的某个地方htmltoItems.

sha*_*ang 64

ByteStrings主要用于二进制数据,但如果您只需要ASCII字符集,它们也是处理文本的有效方法.如果需要处理unicode字符串,则需要使用Text.但是,我必须强调的是,它们都不能替代另一个,它们通常用于不同的东西:虽然Text代表纯粹的unicode,但是ByteString当你通过套接字或文件传输文本时,仍然需要对二进制表示进行编码..

这是一篇关于unicode基础知识的好文章,它解释了unicode代码点(Text)和编码二进制字节(ByteString)的关系:绝对最低每个软件开发人员绝对必须知道Unicode和字符集

您可以使用Data.Text.Encoding模块在两种数据类型之间进行转换,如果您使用的是惰性变体,则可以使用Data.Text.Lazy.Encoding(正如您根据错误消息所做的那样).

  • 请不要对"文本"数据使用字节串,即使您只需要ASCII.对于文本数据使用Text,对打包数据结构使用ByteString.如果我们都同意在语义上应该代表什么类型**,那么我们对使用哪种类型的混淆要少得多,最终类型之间的转换也会减少. (5认同)
  • 是的,`Data.Text.IO` 模块具有处理文件的功能*但*它们几乎从来不是你想要的。它们使用系统语言环境的默认字符集从“ByteString”内部解码“Text”。如果文件碰巧有一些其他编码,则会导致运行时错误或垃圾文本。明确地进行编码和解码几乎总是正确的选择。 (2认同)

Joh*_*n L 26

您肯定希望将Data.Text用于文本数据.

encodeUtf8是要走的路.这个错误:

无法匹配期望类型Data.ByteString.Lazy.Internal.ByteString对抗推断类型Data.ByteString.Internal.ByteString

表示您正在为需要延迟字节字符串的代码提供严格的字节字符串.使用该功能可轻松进行转换:fromChunks

Data.ByteString.Lazy.fromChunks :: [Data.ByteString.Internal.ByteString] -> ByteString
Run Code Online (Sandbox Code Playgroud)

所以你需要做的就是fromChunks [myStrictByteString]在期望lazy bytestring的地方添加函数.

另一种方式的转换可以通过双重功能完成toChunks,它采用一个惰性字节串并给出一个严格的块列表.

如果他们能够提供文本接口而不是字节串接口,或者除了字节串接口之外,您可能想要询问维护者一些软件包.


Tit*_*tou 5

使用单一的功能csData.String.Conversions.

它可以让你之间进行转换String,ByteStringText(以及ByteString.LazyText.Lazy),根据输入和预期的类型.

你仍然需要打电话,但不再担心各自的类型.

有关用法示例,请参阅此答案.