在XML 1.0中有许多不合法编码的字符,例如U+0007
('bell')和U+001B
('escape').大多数有趣的是非空白的"控制"字符.
从(例如)这个问题和其他问题可以清楚地看出,这是XML规范的问题 - 但是有人可以说明为什么 XML规范禁止这些字符吗?
现在看来似乎可能已要求他们在越狱进行编码,例如,作为与
分别,但也许有一个实际的原因的字符被禁止,而不是需要进行转义?
Answerers建议避免传输控制字符有一些动机,但Unicode包含许多其他类似控件的字符(考虑U+200C
"零宽度非连接").我认识到这种行为可能没有充分的理由,但我仍然希望更好地理解它.
这特别令人沮丧,因为当这些字符值出现在其他编码数据格式中时,我最终"双重转义"需要对其进行编码的新XML文档.
我的理解是,这个范围被禁止,理由是标记语言不需要支持传输和流控制字符,包括它们会给二进制转换中的任何编辑器和解析器带来问题.
我很难在Tim Bray等人身上找到任何关于此的信息.
编辑:对控制字符的一些 讨论和模糊的承认它并没有完全过度设计:
Mark Volkmann在17/06/00 -0500 09:27 AM写道:
我从未见过为什么在XML文档中不允许使用大多数ASCII控制字符(例如换页符)的原因.任何人都可以告诉我这个决定背后的原因或指向我的规范.这解释了吗?
如果我们再次这样做,我不确定我们会以同样的方式做到这一点.我不认为他们有任何真正的伤害.显然,如果你正在优化高度可互操作的内容标记语言(而且是XML),那么对垂直标签和退格等等事情表示怀疑是合法的......但是如何保持一致性呢?和DEL等等?-Tim
似乎可能需要将它们编码为转义符,例如 和
除了\ 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+0000
to U+001f
,继承自ASCII.
U+007F
,继承自ASCII
U+0080
到U+009F
,从Latin-1的继承
各种特殊用途范围,明确标准化为Unicode,尤其在非标记上下文中非常有用.这里将逐块讨论它们,包括原因以及如何使用它们或不在XML中使用它们以及如果遇到它们该怎么办.
XML如何查看这些控制字符?
这是一个不同的分类.
Tab和换行符(无论换行符的平台依赖性)都很好.每个人都使用它们.每个人都知道他们应该代表什么.几乎所有已知形式都允许,甚至通常用于标记本身的漂亮打印.
U+0000
是邪恶的.空字符?字符串终止符?二进制噪音?兼容互操作性和标记.禁止各种形式.
还要别的吗?几乎没有使用,有问题的互操作性,但即使不了解他们应该"控制"的内容,也有办法容忍它们.
现在让我们将注意力转移到最后一个类别,控制代码正确.也就是说,下面的总结并不适用于标签和换行符:U+0009
,U+000a
,U+000D
,U+0085
,U+2028
.
XML 1.0允许的控制字符的所有上述范围内,除了U+0000
以U+001f
作为文本(直接包括字符),并作为数字字符引用.允许U+007F
到U+009F
是明显的疏漏和这种不一致是在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?
是啊.那是对的.你需要一个文档元素.你甚至不能放入原始<
或&
.那么为什么你需要输入原始控制字符呢?