gpt4 book ai didi

json - `JSONDecoder` 如何知道使用哪种编码?

转载 作者:行者123 更新时间:2023-11-28 05:45:26 25 4
gpt4 key购买 nike

已阅读 Joel on Encoding像一个好 child 一样,我发现自己对 Foundation 的 JSONDecoder 的工作方式感到困惑,它的 initdecode 方法都不采用编码值。查看文档,我看到实例变量 dataDecodingStrategy ,这也许就是编码猜测魔法发生的地方......?

我在这里遗漏了什么吗? JSONDecoder 不需要知道它接收到的数据的编码吗?我意识到 JSON 标准要求此数据采用 UTF-8 编码,但是 JSONDecoder 可以做出这样的假设吗?我很困惑。

最佳答案

RFC 8259 (从 2017 年开始)要求

JSON text exchanged between systems that are not part of a closed ecosystem MUST be encoded using UTF-8.

较旧的RFC 7159 (自 2013 年起)和 RFC 7158 (从2013年开始)仅指出

JSON text SHALL be encoded in UTF-8, UTF-16, or UTF-32. The defaultencoding is UTF-8, and JSON texts that are encoded in UTF-8 areinteroperable in the sense that they will be read successfully by themaximum number of implementations; there are many implementationsthat cannot successfully read texts in other encodings (such asUTF-16 and UTF-32).

RFC 4627 (从 2006 年开始,我能找到的最古老的):

JSON text SHALL be encoded in Unicode. The default encoding isUTF-8.

Since the first two characters of a JSON text will always be ASCIIcharacters, it is possible to determine whether an octetstream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by lookingat the pattern of nulls in the first four octets.

JSONDecoder(在底层使用 JSONSerialization)能够解码 UTF-8、UTF-16 和 UTF-32,无论是小端还是大端字节序。示例:

let data = "[1, 2, 3]".data(using: .utf16LittleEndian)!
print(data as NSData) // <5b003100 2c002000 32002c00 20003300 5d00>

let a = try! JSONDecoder().decode([Int].self, from: data)
print(a) // [1, 2, 3]

由于有效的 JSON 文本必须以“[”或“{”开头,因此可以从数据的第一个字节明确地确定编码。

不过我没有找到这个记录,人们可能不应该依赖它。 JSONDecoder 的 future 实现可能仅支持较新的标准并需要 UTF-8。

关于json - `JSONDecoder` 如何知道使用哪种编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54936392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com