【发布时间】:2015-06-23 03:41:38
【问题描述】:
哪些 utf-8 字符会破坏 xml。
我在 xml 中传递了一个 utf-8 字符串,我不想确保没有字符会破坏 xml。
【问题讨论】:
哪些 utf-8 字符会破坏 xml。
我在 xml 中传递了一个 utf-8 字符串,我不想确保没有字符会破坏 xml。
【问题讨论】:
UTF-8 旨在从不破坏 ASCII 或在本例中为 <>& 的 XML。它也不能吃 XML 字符。正常的 7 位 ASCII 永远不会出现在多字节序列中(因为高位为 1)。
一个问题是文件开头的冗余 BOM 字符,一个零宽度空间(因此不可见)。用于检测 UTF-8 / UTF-16LE / UTF-16BE,但有时 XML 解析会在 BOM 上失败。
删除字符串开头的 BOM:
String xml = "...";
xml = xml.replaceFirst("^\uFEFF", "");
然而,已弃用的 Unicode 字符在 XML 中也已弃用: Characters not suitable for use with markup。 (更多地与 HTML 相关。)
还有高于 1.0 版的 XML 可能在标签名称中包含 Unicode。在这里,建议使用规范版本的人如何用重音组成字母。
例如,Unicode 字母 ĉ 可以是一个单独的字符 c-circumflex: "\u0109" 或两个字符 c 和组合变音符号 "c\u0302"。由于人们不会看到差异,因此标准化似乎是有序的。
xml = java.text.Normalizer.normalize(xml, Normalizer.Form.NFKC);
【讨论】:
XML 建议states which characters 可用于 XML 文档。基本上它不允许所有控制字符(制表符、换行符和回车符除外)、代理块和 U+FFFE 以及 U+FFFF。
请注意,元素和属性名称有一些extra restrictions,例如不允许使用多个标点符号。 XML 名称上有一个more specific answer
【讨论】:
您从错误的角度看待这个问题。哪个 UTF-8 序列会破坏 XML 不是问题。 UTF-8 只是一种编码方案,XML 规范不处理编码,而是处理 Unicode 代码点。碰巧 XML 可以用 UTF-8 进行编码,但这又是一种编码方案,而不是一种处理方案。
所以真正的问题是:
当从 UTF-8 字符串解码时,哪些 Unicode 代码点会破坏 XML。
XML spec 本身清楚地描述了这个问题的答案,它概述了在 XML 的各个部分中允许和限制哪些代码点。例如:
Text characters 定义为:
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */...
注意:
鼓励文档作者避免使用 [Unicode] 第 2.3 节中定义的“兼容性字符”。也不鼓励使用以下范围内定义的字符。它们要么是控制字符,要么是永久未定义的 Unicode 字符:
[#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDEF], [#x1FFFE-#x1FFFF], [#x2FFFE-#x2FFFF], [#x3FFFE-#x3FFFF], [#x4FFFE-#x4FFFF], [#x5FFFE-#x5FFFF], [#x6FFFE-#x6FFFF], [#x7FFFE-#x7FFFF], [#x8FFFE-#x8FFFF], [#x9FFFE-#x9FFFF], [#xAFFFE-#xAFFFF], [#xBFFFE-#xBFFFF], [#xCFFFE-#xCFFFF], [#xDFFFE-#xDFFFF], [#xEFFFE-#xEFFFF], [#xFFFFE-#xFFFFF], [#x10FFFE-#x10FFFF].
S ::= (#x20 | #x9 | #xD | #xA)+
Name and token characters 定义为:
NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
仅举几例。 Literals、Comments、Character data、Processing Instructions、CData section等中的字符定义还有很多。
因此,您需要阅读 XML 规范以了解在 XML 中的任何给定上下文中允许使用哪些 Unicode 代码点。不同的部分和语法元素对于什么是可接受的和不可接受的有不同的规则。
【讨论】: