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


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

查看所有标签

猜你喜欢:

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

疯狂Java讲义

疯狂Java讲义

李刚 / 电子工业出版社 / 2012-1-1 / 109.00元

《疯狂Java讲义(附光盘第2版)》是《疯狂Java讲义》的第2版,第2版保持了第1版系统、全面、讲解浅显、细致的特性,全面介绍了新增的Java 7的新特性。 《疯狂Java讲义(附光盘第2版)》深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编程、JDBC数据库编程、Java注释、......一起来看看 《疯狂Java讲义》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具