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

问题描述 投票:1回答:1

阅读Joel on Encoding就像一个好孩子一样,我发现自己对基金会的JSONDecoder的运作感到困惑,initdecode方法都没有采用编码值。通过文档查看,我看到了实例变量dataDecodingStrategy,也许这就是编码猜测魔法发生的地方......?

我在这里错过了什么吗? JSONDecoder不应该知道它收到的数据的编码吗?我意识到JSON标准要求这些数据是UTF-8编码的,但JSONDecoder可以做出这样的假设吗?我糊涂了。

json swift
1个回答
1
投票

RFC 8259(2017年起)要求

在不属于封闭生态系统的系统之间交换的JSON文本必须使用UTF-8进行编码。

较旧的RFC 7159(2013年起)和RFC 7158(2013年起)仅表示

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

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

JSON文本应以Unicode编码。默认编码为UTF-8。

由于JSON文本的前两个字符始终是ASCII字符,因此可以通过查看八位字节流是UTF-8,UTF-16(BE或LE)还是UTF-32(BE或LE)来确定前四个八位字节中的空值模式。

JSONDecoder(在引擎盖下使用JSONSerialization)能够解码UTF-8,UTF-16和UTF-32,包括little-endian和big-endian。例:

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的未来实现可能仅支持更新的标准并且需要UTF-8。

© www.soinside.com 2019 - 2024. All rights reserved.