65

有多种字符在 XML 1.0 中是不可合法编码的,例如U+0007('bell') 和U+001B('escape')。大多数有趣的是非空白“控制”字符。

从(例如)这个问题和其他问题中可以清楚地看出,问题在于XML 规范——但是任何人都可以告诉我为什么XML 规范禁止这些字符吗?

似乎可能需要将它们编码为转义符,例如 as分别,但也许有一个实际原因是字符被禁止而不是被要求转义?

回答者建议避免传输控制字符有一些动机,但 Unicode 包含许多其他类似控制的字符(考虑U+200C“零宽度非连接符”)。我承认这种行为可能没有充分的理由,但我仍然想更好地理解它。

这尤其令人沮丧,因为当这些字符值出现在其他编码数据格式中时,我最终会“双重转义”需要对其进行编码的新 XML 文档。

4

6 回答 6

28

我的理解是,这个范围是被禁止的,因为标记语言不需要支持传输和流控制字符,包括它们会给二进制转换中的任何编辑器和解析器带来问题。

不过,我正在努力从 Tim Bray 等人那里找到任何关于这方面的东西。

编辑:对控制字符的一些 讨论和模糊的承认它并没有完全过度设计:

在 17/06/00 -0500 上午 09:27,Mark Volkmann 写道:

我从未见过关于为什么大多数 ASCII 控制字符(例如换页)在 XML 文档中不允许出现的讨论。谁能告诉我该决定背后的原因或指出我的规格。这就解释了?

如果我们再做一次,我不确定我们是否会这样做。我没有看到他们造成任何真正的伤害。显然,如果您正在优化一种高度可互操作的内容标记语言(XML 是),那么怀疑诸如垂直制表符和退格等之类的东西是合理的......但是如何保持一致呢\n和DEL等?-蒂姆

于 2008-12-31T22:42:46.663 回答
22

似乎可能需要将它们编码为转义符,例如  和 

您可以在 XML 1.1 中完全做到这一点,除了 \0。

于 2009-01-02T13:55:17.637 回答
18

那是很久以前的事了,但我最好的回忆是它们没有图形表示,也没有商定的语义。随机选择一对,我们看到 U+0006 “确认”或 U+0016 “同步空闲”......这是什么意思?Unicode 没有说。即使在每个人都声称支持 ASCII 的时候,围绕这个垃圾也没有互操作性。XML 应该是关于互操作性的。

经验是,想要使用这些东西的人真的想将二进制数据塞进他们的 XML 元素中(他们想要的下一件事是包含 U+0000 NULL),这一直是 XML 的明确非目标1. 如果你想表示数字 0x6 或 0x16,有很多很好的方法可以做到这一点,不会混淆“字符”的概念。

于 2009-02-02T16:52:00.817 回答
15

可能是时候重新总结一下了,同样是对 XML 1.1 的看法。

Unicode 中有哪些控制字符代码点?

  • U+0000to U+001f,继承自 ASCII。
  • U+007F, 继承自 ASCII
  • U+0080to U+009F, 继承自 Latin-1
  • 各种特殊用途的范围,针对 Unicode 显式标准化,并且在非标记上下文中尤其有用。此处逐块讨论它们,包括在 XML 中使用它们或不使用它们的原因和方法,以及如果遇到它们该怎么办。

XML 如何看待这些控制字符?

这是一个不同的分类。

  • 制表符和换行符(无论换行符的平台依赖性如何)都很好。每个人都使用它们。每个人都知道他们应该代表什么。允许以几乎所有已知的形式出现,甚至通常用于标记本身的漂亮打印。
  • U+0000是邪恶的。空字符?字符串终止符?二进制噪声?互操作性和标记的对立面。禁止一切形式。
  • 还要别的吗?很少使用,有问题的互操作性,但即使不知道它们应该“控制”什么,也有办法容忍它们。

现在让我们将注意力转移到最后一个类别,控制代码正确。也就是说,以下摘要不适用于制表符和换行符:U+0009, U+000a, U+000D, U+0085, U+2028

XML 1.0 允许所有上述范围的控制字符,除了U+0000U+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<&. 那么为什么你需要输入原始控制字符呢?

于 2015-04-23T15:31:27.683 回答
2

XML 是专门围绕 Unicode(特别是 UTF-8 和 UTF-16)和 ISO/IEC 10646 设计的,这两者(我对 ISO 10646不太肯定)都包含从 ASCII 和基于字符的终端时代。虽然这些字符仍有用处,但它们不属于 XML 之类的格式。

至于这些将这些代码用于其他用途的新编码,似乎 XML 规范可能需要适应。

于 2008-12-31T22:48:40.037 回答
1

你为什么要双重逃避它们?这似乎是 &bell; 的好地方。和 &escape;。(未定义,由解析器的回调处理到您的代码)

于 2009-01-09T14:53:50.533 回答