通过python解码器实现,我注意到如果一个字符串被传递给json.loads,并且它以\ufeff开始,这是一个16 BOM,它会引发一个JSONDecodeError。
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会在这里长大呢?很明显我漏掉了什么。
发布于 2018-04-30 19:25:39
实现不能在网络传输的JSON文本的开头添加字节顺序标记(U+FEFF)。为了实现互操作性,解析JSON文本的实现可能忽略字节顺序标记的存在,而不是将其视为错误。
类似的语言也出现在RFC 7159中。
接受字节顺序标记不需要JSON实现。Python的实现没有。如果要将带有字节顺序标记的JSON传递给Python的JSON解析器,则应该在早期处理阶段删除BOM。
https://stackoverflow.com/questions/50106749
复制相似问题