【问题标题】:Understanding Unicode: Surrogate Blocks, Noncharacters理解 Unicode:代理块、非字符
【发布时间】:2016-04-30 11:05:34
【问题描述】:

我正在尝试真正理解 unicode 标准,并且正在查看 xml spec 的内容:

字符 ::= #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 规范。
  • 如果你只问一个问题,你更有可能得到答案。
  • 嗯,好的,但所有这些问题都高度相关。 @LưuVĩnhPhúc:您提到的文章指出:> 术语“代理对”是指在 UTF-16 编码方案中对具有高代码点的 Unicode 字符进行编码的一种方法。因此,xml 规范使用 UTF-16 编码值来描述 xml?否则,提及代理块没有多大意义。他们为什么这样做?

标签: unicode encoding utf-8 utf-16


【解决方案1】:

什么是代理块?

U+D800U+DFFF 范围内的 Unicode 代码点(含)保留为专用于 UTF-16 代理,在任何其他情况下都是非法的。

它们是表示 4 字节代码点的 UTF-16 代码吗?

是的。

#xXXXX 是指代码点还是这里的 UTF-16 编码值?

实际的 Unicode 代码点。考虑到 Char 的定义包括值 > #xFFFF,单个编码的 UTF-16 值不能超过。 UTF 是代码点值的字节编码方案。 XML 规范是根据代码点编写的,而不是编码。为了存储和传输的目的,可以使用 XML 序言的“编码”属性中指定的任何字符集对 XML 文档进行编码,但实际的 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 序言之前。 XML 规范定义了 XML 文档本身之外的 BOM 处理和字符集检测。这就是为什么Char 定义不包括U+FFFE

U+FFFF 是保留的,不打算在实际内容中使用。这就是Char 定义排除它的原因。

所以基本上Char 定义允许所有 Unicode 代码点减去受限代码点。

【讨论】:

  • 感谢您指出这些非字符是为了简化编码处理而定义的!
猜你喜欢
  • 2014-05-20
  • 1970-01-01
  • 2013-10-17
  • 2010-11-01
  • 2018-12-05
  • 2012-04-24
  • 2010-12-11
  • 1970-01-01
  • 2019-03-06
相关资源
最近更新 更多