理解 Unicode:代理块、非字符
Understanding Unicode: Surrogate Blocks, Noncharacters
我试图真正理解 unicode 标准,并正在浏览 xml spec 的内容:
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
现在我有几个问题:
- 代理块是什么?它们是表示 4 字节代码点的 UTF-16 代码吗?
- 这里的#xXXXX指的是代码点还是UTF-16编码值?
- 如果指的是代码点,我对代理块的理解是正确的:这里为什么要提到代理块?从 space 编码映射中隐藏那些与编码相关的细节不是编码的任务吗?
- 为什么像 "U+FFFE" 这样的非字符被定义为 unicode 标准的一部分?据我了解,字节顺序检测(以及处理灵活大小的代码字)取决于编码。
感谢您的澄清!
What are the surrogate blocks?
U+D800
到 U+DFFF
范围内的 Unicode 代码点(含),保留用作 UTF-16 代理项,在任何其他上下文中都是非法的。
Are they the UTF-16 codes that indicate a 4 byte code point?
是的。
Does #xXXXX refer to the code point or to the UTF-16 encoded value here?
实际的 Unicode 代码点。考虑到 Char
的定义包括值 > #xFFFF,单个编码的 UTF-16 值不能超过。 UTF 是代码点值的字节编码方案。 XML 规范是根据代码点而不是编码编写的。 XML 文档可以编码为 XML prolog 的 "encoding" 属性中指定的任何字符集,以便存储和传输,但实际的 XML 内容在未编码代码点的术语。
If it refers to the code point and my understanding of the surrogate blocks is correct: Why are the surrogate blocks mentioned here?
代理代码点是保留的,不允许在任何文本内容中以未编码的形式出现。 Char
定义只是强制执行该规则。
Why are non-characters like "U+FFFE" defined as part of the unicode standard? As to my understanding, Byte-order detection (as well as handling flexible sized code words) is up to the encoding.
因为编码并不总是提前知道,可能需要动态检测。 U+FFFE
用作 BOM 标记以帮助促进这一点。 Unicode 的早期版本允许 U+FFFE
在文本内容中用作 BOM 或实际的不间断 space 字符。这有时会导致歧义。因此,较新版本的 Unicode 仅将 U+FFFE
严格保留为 BOM,并且不间断间距由 U+2060 WORD JOINER
处理以避免任何歧义。
也就是说,在 XML 的上下文中,在任何文本内容中使用 U+FFFE
是没有意义的。整个文档以特定字符集编码,使用的任何 BOM 都必须出现在 XML 序言之前。 XML 规范在 XML 文档本身之外定义了 BOM 处理和字符集检测。这就是 Char
定义排除 U+FFFE
.
的原因
U+FFFF
已保留,不打算在实践中用于实际内容。所以这就是 Char
定义将其排除在外的原因。
所以基本上 Char
定义允许所有 Unicode 代码点减去受限代码点。
我试图真正理解 unicode 标准,并正在浏览 xml spec 的内容:
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
现在我有几个问题:
- 代理块是什么?它们是表示 4 字节代码点的 UTF-16 代码吗?
- 这里的#xXXXX指的是代码点还是UTF-16编码值?
- 如果指的是代码点,我对代理块的理解是正确的:这里为什么要提到代理块?从 space 编码映射中隐藏那些与编码相关的细节不是编码的任务吗?
- 为什么像 "U+FFFE" 这样的非字符被定义为 unicode 标准的一部分?据我了解,字节顺序检测(以及处理灵活大小的代码字)取决于编码。
感谢您的澄清!
What are the surrogate blocks?
U+D800
到 U+DFFF
范围内的 Unicode 代码点(含),保留用作 UTF-16 代理项,在任何其他上下文中都是非法的。
Are they the UTF-16 codes that indicate a 4 byte code point?
是的。
Does #xXXXX refer to the code point or to the UTF-16 encoded value here?
实际的 Unicode 代码点。考虑到 Char
的定义包括值 > #xFFFF,单个编码的 UTF-16 值不能超过。 UTF 是代码点值的字节编码方案。 XML 规范是根据代码点而不是编码编写的。 XML 文档可以编码为 XML prolog 的 "encoding" 属性中指定的任何字符集,以便存储和传输,但实际的 XML 内容在未编码代码点的术语。
If it refers to the code point and my understanding of the surrogate blocks is correct: Why are the surrogate blocks mentioned here?
代理代码点是保留的,不允许在任何文本内容中以未编码的形式出现。 Char
定义只是强制执行该规则。
Why are non-characters like "U+FFFE" defined as part of the unicode standard? As to my understanding, Byte-order detection (as well as handling flexible sized code words) is up to the encoding.
因为编码并不总是提前知道,可能需要动态检测。 U+FFFE
用作 BOM 标记以帮助促进这一点。 Unicode 的早期版本允许 U+FFFE
在文本内容中用作 BOM 或实际的不间断 space 字符。这有时会导致歧义。因此,较新版本的 Unicode 仅将 U+FFFE
严格保留为 BOM,并且不间断间距由 U+2060 WORD JOINER
处理以避免任何歧义。
也就是说,在 XML 的上下文中,在任何文本内容中使用 U+FFFE
是没有意义的。整个文档以特定字符集编码,使用的任何 BOM 都必须出现在 XML 序言之前。 XML 规范在 XML 文档本身之外定义了 BOM 处理和字符集检测。这就是 Char
定义排除 U+FFFE
.
U+FFFF
已保留,不打算在实践中用于实际内容。所以这就是 Char
定义将其排除在外的原因。
所以基本上 Char
定义允许所有 Unicode 代码点减去受限代码点。