编码
JSON文本应以Unicode编码.默认编码为UTF-8.
由于JSON文本的前两个字符将始终为ASCII字符[RFC0020],因此可以确定八位字节流是UTF-8,UTF-16(BE或LE)还是UTF-32(BE或LE)通过查看前四个八位字节中的空值模式.
它是什么意思"因为JSON文本的前两个字符将始终是ASCII字符[RFC0020]"?我看过RFC0020,却找不到任何关于它的信息.JSON可以是{"或{"(即引号之前的空白).
RFC 4627需要 JSON 文档来表示对象或数组。因此,第一个字符必须(可以包含任意数量的 JSON 空白字符)[后跟一个值或{后跟"。值为null、true、false或字符串 ( "\xe2\x80\xa6)、对象或数组。因此,由于 JSON 空白字符 、[、{、n、和位于C0 控件和基本拉丁语块中,因此它们也位于 ASCII 字符集中 [根据 Unicode 的设计] t。(不知道为什么标准会固定在“ASCII”上,因为它说“JSON 文本应使用 Unicode 进行编码。”未来的标准会删除该引用。)f"
UTF-32 每个字符有四个字节。UTF-16 有两个。因此,要区分 UTF-16 和 UTF-32,需要 4 个字节。在这两种编码中,来自C0 控制和基本拉丁语块的字符最多使用一个非零字节进行编码(值为 0 的字节有时称为“空字节”)。此外,U+0000(在 UTF-32 中编码为 0x00 0x00 0x00 0x00,在 UTF-16 中编码为 0x00 0x00)不是有效的 JSON 空格。因此,0x00 字节的模式可用于确定有效的 JSON 文档使用哪种允许的编码。
\nRFC 7159更改了 JSON,以允许 JSON 文档表示任何值,而不仅仅是对象或数组。因此,原标准中的表述不再有效。因此,字符检测算法被破坏并从标准中删除。
\n为了准确检测,您需要查看文档的开头和结尾。0x22 0x00 0x00 0x00开头的可以是UTF-8、UTF-16LE、UTF-32LE中的任意一个;它是包含零个或多个 U+0000 个字符的字符串的开头。在这种情况下,您需要末尾的 0x00 字节数来判断是哪个。
\nRFC 8259将 JSON 更改为需要 UTF-8(对于“在不属于封闭生态系统的系统之间交换的 JSON”)。实际上,JSON 阅读器仍然会接受 UTF-16 和 UTF-32。
\n最后,一些流行的 JSON 解析器将字符解码留给调用者,其 API 只接受编程环境的“本机”字符串类型。(这会带来使用错误的字符编码来读取文本文件或 HTTP 正文的非常常见的危险。)
\n| 归档时间: |
|
| 查看次数: |
1435 次 |
| 最近记录: |