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

时间:2008-12-31 21:48:45

标签: xml unicode history

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

很明显(例如)this question和其他人the XML spec that's the issue - 但是有人可以说明为什么 XML规范禁止这些字符吗?

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

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

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

6 个答案:

答案 0 :(得分:24)

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

我很难在Tim Bray等人那里找到任何关于此的信息。

编辑:控制字符的some discussion以及模糊的承认它并没有完全过度设计:

  

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

     
    

我从未见过有关大多数ASCII控件的原因的讨论     XML文档中不允许使用换页等字符。能够     任何人都告诉我这个决定背后的原因或指向我的规范。那     解释说?

  
     

如果我们再次这样做,我不确定我们会以同样的方式做到这一点。一世   不要认为他们有任何真正的伤害。显然,如果你正在优化   对于高度可互操作的内容标记语言(和XML),它是   合法地对垂直标签和退格之类的东西持怀疑态度   等等......但是如何在\ n和DEL中保持一致   等等? -Tim

答案 1 :(得分:16)

  

似乎可能要求它们以转义编码,例如as和

除了\ 0。

之外,你可以在XML 1.1中做到这一点

答案 2 :(得分:16)

那是很久以前的事了,但我最好的回忆是他们没有图形表示,也没有商定的语义。随机挑选一对夫妇我们看到U + 0006“Acknowledge”或U + 0016“同步闲置”......这是什么意思? Unicode没有说。甚至当每个人都声称支持ASCII时,这个垃圾也没有互操作性。 XML应该是关于互操作性的。

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

答案 3 :(得分:13)

现在可能需要重新审视,也可以在XML 1.1中查看。

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

  • U+0000U+001f,继承自ASCII。
  • U+007F,继承自ASCII
  • U+0080U+009F,继承自Latin-1
  • 各种特殊用途范围,明确标准化为Unicode,尤其在非标记上下文中非常有用。它们是discussed here逐块,包括原因以及如何使用它们或不在XML中使用它们以及如果碰到它们该怎么办。

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

这是一个不同的分类。

  • Tab和换行符(无论新行的平台依赖性如何)都是好的。每个人都使用它们。每个人都知道他们应该代表什么。允许几乎所有已知的形式,通常甚至是标记本身的漂亮打印。
  • U+0000是邪恶的。空字符?字符串终止符?二进制噪音?兼容互操作性和标记。禁止各种形式。
  • 还有别的吗?几乎没有使用过的,有问题的互操作性,但是有一些方法可以容忍它们,即使不了解它们应该是什么,控制它们是什么。

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

XML 1.0允许上述所有控制字符范围(U+0000U+001f除外)作为文本(直接包含字符)和numeric character references。允许U+007F U+009F遗漏apparently,这种不一致在XML 1.1中得到了纠正,但反之亦然。他们甚至在标准中给出了详细的理由:

  

最后,需要在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不同?

呀。这是对的。你需要一个文档元素。您甚至无法投入原始<&。那么为什么你需要输入原始控制字符呢?

答案 4 :(得分:2)

XML是专门围绕Unicode(特别是UTF-8和UTF-16)和ISO / IEC 10646设计的,两者(我不是相当关于ISO 10646的正面)包含传输/从ASCII遗留的流控制字符和基于字符的终端的日期。虽然这些字符仍然有用,但它们不属于XML格式。

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

答案 5 :(得分:1)

你为什么要双重逃脱?这对于&amp; bell来说似乎是一个好地方;和&amp;逃避; (未定义,由解析器到代码的回调处理)