首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么python解码器会抛出一个带有UTF-16 BOM的字符串?

为什么python解码器会抛出一个带有UTF-16 BOM的字符串?
EN

Stack Overflow用户
提问于 2018-04-30 19:11:37
回答 1查看 537关注 0票数 2

通过python解码器实现,我注意到如果一个字符串被传递给json.loads,并且它以\ufeff开始,这是一个16 BOM,它会引发一个JSONDecodeError

代码语言:javascript
复制
if isinstance(s, str):
    if s.startswith('\ufeff'):
        raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)", s, 0)

(github)

RFC3629 (UTF-81)说明了两种应禁止UTF-16 BOM的情况,但它们似乎都不适用于JSON:

O协议应禁止使用U+FEFF作为对协议要求始终为UTF-8的文本协议元素的签名,在这些情况下,签名函数是完全无用的。 O协议还应禁止使用U+FEFF作为该协议为其提供字符编码标识机制的文本协议元素的签名,当该协议的实现能够始终正确地使用这些机制时。当协议元素从创建时到其(正确标记的)传输时被严格控制在实现的控制下时,就会发生这种情况。

RFC7159 ( JSON )说:

JSON文本应以UTF-8、UTF-16或UTF-32编码.默认编码是UTF-8,而在UTF-8中编码的JSON文本是可互操作的,因为它们将被最大数量的实现成功读取;有许多实现无法成功地读取其他编码中的文本(如UTF-16和UTF-32)。

所以在我看来,UTF-16应该被允许。那么为什么Python会在这里长大呢?很明显我漏掉了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-30 19:25:39

来自目前最新的JSON RFC

实现不能在网络传输的JSON文本的开头添加字节顺序标记(U+FEFF)。为了实现互操作性,解析JSON文本的实现可能忽略字节顺序标记的存在,而不是将其视为错误。

类似的语言也出现在RFC 7159中。

接受字节顺序标记不需要JSON实现。Python的实现没有。如果要将带有字节顺序标记的JSON传递给Python的JSON解析器,则应该在早期处理阶段删除BOM。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50106749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档