可能是时候重新总结一下了,同样是对 XML 1.1 的看法。
Unicode 中有哪些控制字符代码点?
U+0000
to U+001f
,继承自 ASCII。
U+007F
, 继承自 ASCII
U+0080
to U+009F
, 继承自 Latin-1
- 各种特殊用途的范围,针对 Unicode 显式标准化,并且在非标记上下文中尤其有用。此处逐块讨论它们,包括在 XML 中使用它们或不使用它们的原因和方法,以及如果遇到它们该怎么办。
XML 如何看待这些控制字符?
这是一个不同的分类。
- 制表符和换行符(无论换行符的平台依赖性如何)都很好。每个人都使用它们。每个人都知道他们应该代表什么。允许以几乎所有已知的形式出现,甚至通常用于标记本身的漂亮打印。
U+0000
是邪恶的。空字符?字符串终止符?二进制噪声?互操作性和标记的对立面。禁止一切形式。
- 还要别的吗?很少使用,有问题的互操作性,但即使不知道它们应该“控制”什么,也有办法容忍它们。
现在让我们将注意力转移到最后一个类别,控制代码正确。也就是说,以下摘要不适用于制表符和换行符:U+0009
, U+000a
, U+000D
, U+0085
, U+2028
。
XML 1.0 允许所有上述范围的控制字符,除了U+0000
、U+001f
作为文本(直接包含的字符)和作为数字字符引用。允许显然U+007F
是遗漏的,这种不一致在 XML 1.1 中得到了纠正,但反过来。他们甚至在标准中给出了详细的理由:U+009F
最后,对定义 XML 文档中任意 Unicode 字符的标准表示存在相当大的需求。因此,XML 1.1 允许使用对控制字符 #x1 到 #x1F 的字符引用,其中大部分在 XML 1.0 中是被禁止的。然而,出于鲁棒性的原因,这些字符仍然不能直接在文档中使用。为了提高字符编码检测的稳健性,在 XML 1.0 文档中自由允许的附加控制字符 #x7F 到 #x9F 现在也必须仅作为字符引用出现。(空白字符当然是例外的。)向后兼容性的微小牺牲被认为是不重要的。由于 API 的潜在问题,#x0 仍然被禁止直接和作为字符引用。
为什么 Unicode 和 XML 允许自由使用类似标记的控制字符,除了少数“继承”的范围?人们应该为那些使用标记。
Unicode 也用于非标记上下文,它是一个仍在发展的字符集。如果非控制字符集是移动目标,那么实现符合标准的 XML 处理器就太难了。
好的,那么与特定于 Unicode 的控制字符相比,继承的范围有什么问题?
缺乏标准化。Unicode 联盟并没有真正选择将哪些数字分配给这些“字符”,或者它们的典型视觉呈现或含义是什么。与 ASCII(在编码的 UTF-8 级别)和 Latin-1(在代码点分配级别)的完全向后兼容性强制原始包含这些代码点,而不管在各种文本处理上下文中经常附加到它们的各种特殊和重载含义。
等等,你是说 XML 并不意味着完全向后兼容 ASCII,不像 UTF-8?
是的。这是正确的。您需要一个文档元素。你甚至不能放入一个 raw<
或&
. 那么为什么你需要输入原始控制字符呢?