在JSON规范中,"由于JSON文本的前两个字符始终是ASCII字符"是什么意思?

dan*_*son 5 json

Json上的RFC 4627读取:

  1. 编码

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

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

它是什么意思"因为JSON文本的前两个字符将始终是ASCII字符[RFC0020]"?我看过RFC0020,却找不到任何关于它的信息.JSON可以是{"或{"(即引号之前的空白).

Ode*_*ded 7

这意味着由于JSON始终以ASCII字符开头(非ASCII仅允许在字符串中,而不能是根对象),因此可以从流/文件的开头确定它所处的编码.

UTF-16和UTF-32应该有一个出现在流开头的BOM,通过找出它是什么,您可以确定准确的编码.这是可能的,因为可以确定第一个字符是否是JSON.

我认为规范特别提到了许多其他文本流/文件,这并不总是可行的(因为大多数文本文件可以以任何两个字符开头,并且事先不知道实际文件的两个第一个字节).


Tom*_*get 6

RFC 4627需要 JSON 文档来表示对象或数组。因此,第一个字符必须(可以包含任意数量的 JSON 空白字符)[后跟一个值或{后跟"。值为nulltruefalse或字符串 ( "\xe2\x80\xa6)、对象或数组。因此,由于 JSON 空白字符 、[{n、和位于C0 控件和基本拉丁语块中,因此它们也位于 ASCII 字符集中 [根据 Unicode 的设计] t。(不知道为什么标准会固定在“ASCII”上,因为它说“JSON 文本应使用 Unicode 进行编码。”未来的标准会删除该引用。)f"

\n

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 文档使用哪种允许的编码。

\n

RFC 7159更改了 JSON,以允许 JSON 文档表示任何值,而不仅仅是对象或数组。因此,原标准中的表述不再有效。因此,字符检测算法被破坏并从标准中删除。

\n

为了准确检测,您需要查看文档的开头和结尾。0x22 0x00 0x00 0x00开头的可以是UTF-8、UTF-16LE、UTF-32LE中的任意一个;它是包含零个或多个 U+0000 个字符的字符串的开头。在这种情况下,您需要末尾的 0x00 字节数来判断是哪个。

\n

RFC 8259将 JSON 更改为需要 UTF-8(对于“在不属于封闭生态系统的系统之间交换的 JSON”)。实际上,JSON 阅读器仍然会接受 UTF-16 和 UTF-32。

\n
\n

最后,一些流行的 JSON 解析器将字符解码留给调用者,其 API 只接受编程环境的“本机”字符串类型。(这会带来使用错误的字符编码来读取文本文件或 HTTP 正文的非常常见的危险。)

\n