好的,让我们将字符的问题分开:
- 在任何 XML 文档中都完全无效。
- 需要转义。
@dolmen 在“https://stackoverflow.com/questions/730133/invalid-characters-in-xml/5110103#5110103”中提供的答案仍然有效,但需要使用 XML 1.1 规范进行更新。
1。无效字符
这里所描述的字符是XML文档中允许插入的所有字符。
1.1。在 XML 1.0 中
允许的字符的全局列表是:
[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
基本上,控制字符和超出 Unicode 范围的字符是不允许的。
这也意味着禁止调用例如字符实体。
1.2。在 XML 1.1 中
允许的字符的全局列表是:
[2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
[2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
此版本的 XML 建议扩展了允许的字符,因此允许使用控制字符,并考虑了 Unicode 标准的新版本,但仍然不允许使用这些字符:NUL (x00)、xFFFE、xFFFF...
但是,不鼓励使用控制字符和未定义的 Unicode 字符。
还可以注意到,并非所有解析器都将这一点考虑在内,带有控制字符的 XML 文档可能会被拒绝。
2。需要转义的字符(以获得格式良好的文档):
< 必须使用 &#60; 实体进行转义,因为它被假定为标签的开头。
& 必须使用 &#38; 实体进行转义,因为它被假定为实体引用的开始
> 应使用 &#62; 实体进行转义。这不是强制性的——它取决于上下文——但强烈建议不要使用它。
' 应使用 &#39; 实体进行转义——在单引号内定义的属性中是必需的,但强烈建议始终对其进行转义。
" 应使用 &#34; 实体进行转义——在双引号内定义的属性中是必需的,但强烈建议始终对其进行转义。