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


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

查看所有标签

猜你喜欢:

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

快速转行做产品经理

快速转行做产品经理

李三科 / 华中科技大学出版社 / 2018-6-1 / 39.90

互联网已经进入以产品为中心的时代,不懂技术一样做高薪产品经理。本书将满足你转行、就业、加薪的愿望。 . 作者李三科,互联网资深产品经理。2011年离开传统销售行业进入互联网行业工作,从对产品经理的工作一无所知,到成长为一名年薪几十万的资深产品经理,他对产品经理职业有着深刻的理解,也积累了丰富的学习、工作经验。本书以作者亲身经历为线索,讲解学习产品经理相关知识和工作方法的经验,同时介绍求......一起来看看 《快速转行做产品经理》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具