为什么在XML 1.0中“控制”字符是非法的?

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

从(例如) 这个问题和其他问题可以清楚地看到, XML规范是这个问题 – 但是谁能告诉我为什么 XML规范禁止这些字符?

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

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

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

我的理解是,这个范围是被禁止的,因为标记语言不应该有任何支持传输和stream量控制字符的需要,并且包括它们会在二进制转换中给任何编辑器和parsing器造成问题。

虽然Tim Bray等人在这方面正在努力寻找任何东西。

编辑:控制字符的一些 讨论和一个模糊的承认它不完全过度devise:

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

我从未见过讨论大多数ASCII控制字符(如换页)在XML文档中不被允许的原因。 任何人都可以告诉我这个决定背后的原因或指向我的规范。 这解释了什么?

如果我们再次这样做,我不确定我们会这样做。 我没有看到他们有任何真正的伤害。 显然,如果你正在为一个高度可互操作的内容标记语言(而XML是)进行优化,那么对垂直制表符和退格符等等的怀疑是合理的,但是如何保持一致,离开\ n和DEL等? -Tim

那是很久以前的事了,但我最好的回忆是,他们没有graphics表示,也没有商定的语义。 随机挑选一对,我们看到U + 0006“确认”或U + 0016“同步空闲”……这些是什么意思? Unicode不说。 甚至当大家声称支持ASCII时,在这个垃圾周围也没有互操作性。 XML应该是关于互操作性的。

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

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

除了\ 0之外,您可以在XML 1.1中完成所有操作。

现在可能是重新整理的时候了,也是XML 1.1的观点。

Unicode中有什么控制字符的代码点?

  • U+0000U+001f ,从ASCIIinheritance。
  • U+007F ,从ASCIIinheritance
  • U+0080U+009F ,inheritance自Latin-1
  • 各种专用范围,明确标准化为Unicode,尤其在非标记语境中尤其有用。 在这里我们将逐块讨论它们,包括为什么以及如何使用它们,或者不在XML中使用它们,以及如果遇到它们,应该怎么做。

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

这是一个不同的分类。

  • Tab和换行符(不pipe什么是换行符的平台依赖性)都是好的。 每个人都使用它们。 每个人都知道他们应该代表什么。 几乎允许所有已知的forms,通常甚至为漂亮的打印本身。
  • U+0000是邪恶的。 空字符? string结束符? 二进制噪声? 对互操作性和标记的对立。 禁止所有forms。
  • 还要别的吗? 几乎没有使用,互操作性有问题,但即使不知道他们应该“控制”什么,也有办法容忍他们。

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

XML 1.0允许除U+0000U+001f以外的所有上述范围的控制字符作为文本(直接包含的字符),甚至允许那些(除了邪恶的U+0000 )作为数字字符引用 。 允许U+007FU+009F 显然是遗漏的,这种不一致在U+009F中得到了纠正, U+009F 。 他们甚至在标准内提供了一个详细的理由:

最后,需要在XML文档中定义任意Unicode字符的标准表示。 因此,XML 1.1允许使用字符引用来控制字符#x1到#x1F,其中大多数在XML 1.0中是被禁止的。 但是,由于鲁棒性的原因,这些字符仍然不能直接在文档中使用。 为了提高字符编码检测的健壮性,XML 1.0文档中允许使用的附加控制字符#x7F到#x9F现在也必须仅作为字符引用出现。 (空白字符当然是免除的。)向后兼容性的小牺牲被认为是不重要的。 由于API的潜在问题,#x0直接和作为字符引用仍然被禁止。

为什么Unicode和XML允许自由使用类似标记的控制字符,除了less数“inheritance”的范围? 人们应该使用这些标记。

Unicode也用于非标记上下文,它是一个不断发展的字符集。 如果一组非控制字符是移动目标,那么实现一致的XML处理器就太困难了。

那么,与Unicode特有的控制字符相比,那么inheritance的范围有什么问题呢?

缺乏标准化。 Unicode联盟并没有真正select哪些数字分配给这些“字符”,或者他们典型的视觉expression或意义是什么。 与ASCII(在编码UTF-8级别)和Latin-1(在代码点分配级别上)完全向后兼容,强制原始包含这些代码点,而不pipe在各种文本处理上下文中经常附加的各种专用和重载意义。

等等,你是说XML不像UTF-8那样完全向后兼容ASCII吗?

是啊。 这是正确的。 你需要一个文档元素。 你甚至不能放入一个生的<& 。 那么为什么你需要把原始的控制angular色?

XML是专门针对Unicode(特别是UTF-8和UTF-16)和ISO / IEC 10646而devise的,这两者(我对ISO 10646 不太肯定)都包含ASCII和基于字符的terminal的日子。 虽然这些字符仍然有用,但它们不属于像XML这样的格式。

至于这些使用这些代码的新编码,好像XML规范可能需要适应。

你为什么要逃避他们? 这似乎是一个&钟的好地方; 和&escape ;. (未定义,通过parsing器callback到您的代码处理)