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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么“控制”字符在XML 1.0中是非法的?相关的知识,希望对你有一定的参考价值。

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

从(例如)this question和其他人那里可以清楚地知道它是the XML spec that's the issue - 但是有人可以解释为什么XML规范禁止这些字符吗?

似乎可能要求它们以转义编码,例如分别是,但也许有一个实际的理由是角色被禁止而不是被要求逃脱?

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

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

答案

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

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

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

Mark Volkmann在17/06/00 -0500 09:27 AM写道:

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

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

另一答案

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

除了 0之外,您可以在XML 1.1中完全执行此操作。

另一答案

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

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

另一答案

现在可能是重新初步化的时候了,同时也是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+007FU+009Fapparently的遗漏,这种不一致在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?

是啊。那是对的。你需要一个文档元素。你甚至不能放入原始的<&。那么为什么你需要输入原始控制字符呢?

另一答案

XML是专门围绕Unicode(特别是UTF-8和UTF-16)和ISO / IEC 10646设计的,两者都是(我对ISO 10646不太满意)包含从ASCII和遗留下来的传输/流控制字符。基于角色的终端的日子。虽然这些字符仍然有用,但它们不属于XML格式。

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

另一答案

你为什么要双重逃脱呢?这似乎是和贝尔的好地方;和&逃避; (未定义,由解析器到代码的回调处理)

以上是关于为什么“控制”字符在XML 1.0中是非法的?的主要内容,如果未能解决你的问题,请参考以下文章

字符串中的“→”导致错误“在 SQL/XML 表达式中发现非法 XML 字符 001A”(DB2)

为啥指向未定义结构的指针有时在 C 和 C++ 中是非法的

Task<Task> 在 C# 中是非法的吗?

Java用非法XML字符解组xml

从 xml 中删除非法的 0x1f 字符

用freemarker 生成word,打开word xml字符非法!这是啥原因?