haskell – 为什么图书馆设计师使用ByteString文本似乎是合适的?

栏目: 编程语言 · 发布时间: 7年前

内容简介:http://stackoverflow.com/questions/14080659/why-do-library-designers-use-bytestring-where-text-seems-to-be-appropriate
在我的应用程序上工作,我偶然发现了一个 Aeson not decoding UTF8 input 的问题.挖掘更深层次,我发现它依赖于Attoparsec的 Parser ByteString

,这似乎是我的问题的根源.但这其实不是我在这里问的.

事情是,这不是我看到人们使用ByteString的唯一的地方,因为它对我来说似乎很明显,只有Text是适当的,因为JSON不是一些二进制文件,它是一个可读的文本,它可能很好地包含UTF8字符.

所以我想知道我是否缺少某些东西,而且有合理的理由选择ByteString Over Text,或者这是一个很普遍的现象,这是由大多数人关心的任何其他字符集而不是拉丁语造成的坏图书馆设计.

我觉得 your problem

只是一个误会.

Prelude> print "Ёжик лижет мёд."
"\1025\1078\1080\1082 \1083\1080\1078\1077\1090 \1084\1105\1076."
Prelude> putStrLn "\1025\1078\1080\1082 \1083\1080\1078\1077\1090 \1084\1105\1076."
Ёжик лижет мёд.
Prelude> "{\"a\": \"Ёжик лижет мёд.\"}"
"{\"a\": \"\1025\1078\1080\1082 \1083\1080\1078\1077\1090 \1084\1105\1076.\"}"

当您打印包含字符串的值时,将使用“Char”的“Show”实例,并转义所有代码点高于127的所有字符.要获取所需的字形,需要putStr [Ln] String.

所以aeson正确解码utf8编码的输入,这是应该预期的,因为它utf8编码的值本身:

encode = {-# SCC "encode" #-} encodeUtf8 . toLazyText . fromValue .
         {-# SCC "toJSON" #-} toJSON

那么为什么aeson使用ByteString而不是Text来解码的最终目标编码和起始点.

因为这是适当的类型.编码值旨在在机器之间可移植地传输.这发生在一个字节流(八位字节,如果我们在沮丧的心情).这正是ByteString提供的,然后必须以特定应用程序处理的字节序列.为了aeson的目的,字节流应该被编码在utf-8中,并且aeson假定解码函数的输入是有效的utf-8,并将其输出编码为有效的utf-8.

转移例如文本将遇到可移植性问题,因为16位编码取决于字节顺序,因此文本不是在机器之间交换数据的适当格式.请注意,aeson在编码时使用Text作为中间类型(也可能在解码时),因为这是在中间阶段使用的适当类型.

http://stackoverflow.com/questions/14080659/why-do-library-designers-use-bytestring-where-text-seems-to-be-appropriate


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Linux内核完全剖析

Linux内核完全剖析

赵炯 / 机械工业出版社 / 2006-1 / 79.00元

本书对早期Linux操作系统内核全部代友文件进行了详细的剖析,旨在让读者在尽量短的时间内对Linux的工作机理获得全面而深刻的理解,为进一步学习和研究Linux系统打下坚实的基础。虽然选择的版本较低,但该内核已能够正常编译运行,并且其中已包括了Linux工作原理的精髓。书中首先以Linux源代码版本的变迁为主线,简要介绍了Lin-ux系统的发展历史,同时着重说明了各个内核版本之间的主要区别和改进方......一起来看看 《Linux内核完全剖析》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码