什么是代理块?
代理块是指Unicode代码点范围在U+D800到U+DFFF之间(包括这两个代码点),专门用于UTF-16代理,不允许在其他上下文中使用。
它们是否是指示4字节代码点的UTF-16编码?
是的。
这里的#xXXXX是指代码点还是UTF-16编码值?
实际的Unicode代码点。考虑到Char的定义包括大于#xFFFF的值,单个编码的UTF-16值不能超过该值。UTF是代码点值的字节编码方案。XML规范是以代码点而不是编码为基础编写的。XML文档可以使用XML prolog中的“encoding”属性指定任何字符集进行存储和传输,但实际的XML内容是根据未编码的代码点处理的。
如果它是指代码点并且我对代理块的理解是正确的:为什么在这里提到代理块?
代理代码点是保留的,不允许出现在任何文本内容中未编码的状态下。Char的定义只是强制执行该规则。
为什么像“U+FFFE”这样的非字符被定义为Unicode标准的一部分?据我所知,字节序检测(以及处理可变大小的代码字)由编码处理。
因为编码不总是事先知道的,可能必须动态检测。U+FFFE用作BOM标记以帮助进行处理。Unicode的早期版本允许将U+FFFE用作文本内容中的换行空格字符或BOM。这导致有时会出现歧义。因此,新版本的Unicode仅将U+FFFE保留为BOM,并使用U+2060 WORD JOINER来处理非换行间距以避免任何歧义。
话虽如此,在XML的上下文中,在任何文本内容中使用U+FFFE都没有意义。整个文档都是在特定字符集中编码的,任何使用的BOM都必须出现在XML prolog之前。XML规范定义了BOM处理和字符集检测,这些都不在XML文档本身之内。这就是为什么Char定义排除了U+FFFE的原因。
U+FFFF是保留的,实际上不打算在实践中使用。这就是为什么Char定义排除它的原因。
因此,Char定义允许所有Unicode代码点减去受限制的代码点。