理解 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. */

现在我有几个问题:

感谢您的澄清!

What are the surrogate blocks?

U+D800U+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 代码点减去受限代码点。