了解Unicode:代理块,非字符

4

我正在尝试理解Unicode标准,并查看了xml规范,其中写到:

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* 任何Unicode字符,不包括代理块、FFFE和FFFF。 */

现在我有几个问题:

  • 什么是代理块?它们是指表示4字节代码点的UTF-16代码吗?
  • #xXXXX这里是指代码点还是UTF-16编码值?
  • 如果它指的是代码点,而我的对代理块的理解是正确的:为什么要在这里提到代理块?难道一个编码的任务不应该是将这些编码相关的细节隐藏起来,使其从编码映射所在的空间中消失吗?
  • 为什么非字符(如“U+FFFE”)被定义为Unicode标准的一部分?据我所知,字节顺序检测(以及处理灵活大小的码字)由编码决定。

感谢您的澄清!


你是在询问Unicode标准还是W3C的XML规范? - 一二三
关于 XML 规范中的 Unicode 标准;) 第二个问题涉及到 XML 规范中使用的符号表示法,但我想了解Unicode在此处的作用。 到目前为止,我认为Unicode描述了所有已知符号的集合(并为它们分配了一个数字),而像UTF-8这样的编码描述了从Unicode字符流到字节流(反之亦然)的映射。但是,然后我读到了这个让我困惑的xml规范。 - Henning
https://dev59.com/Vm025IYBdhLWcg3wnXWf - phuclv
1
如果您只提出一个问题,那么您更有可能得到答案。 - nwellnhof
嗯,好的,但所有这些问题都高度相关。 @LưuVĩnhPhúc:您提到的文章指出:
“代理对”一词是指使用UTF-16编码方案对具有高代码点的Unicode字符进行编码的一种方法。 因此,xml规范使用UTF-16编码值来描述xml?否则,提到代理块就没有太多意义了。他们为什么要这样做?
- Henning
1个回答

8
什么是代理块?
代理块是指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代码点减去受限制的代码点。

感谢您指出这些非字符是为了简化编码处理而定义的! - Henning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接