我整理了一些我真正旧的Java代码,在XML解析包含在JDK库之前写入XML规范的第一版,并尝试将其更新并编写一些试验。特别是我(重新)实现了这样的XML character encoding autodetection:
<?xml
开始的BOM。encoding=
声明,如果有的话,根据XML规范可能会告诉我一些更具体的或深奥的编码所以,让我们说该文件有一个UTF-16LE的实际BOM。 XML encoding
属性的值应该是多少?它应该是encoding="UTF-16LE"
吗?但Unicode Byte Order Mark FAQ似乎表明,如果存在UTF-16系列物料清单,我应该#34;标记文本&#34;仅仅UTF-16
。这是否意味着我应该在我的XML文件中使用encoding="UTF-16"
?但是,我的解析器应该忽略encoding
值并使用它从BOM中确定的更具体的字符集吗?我开始迷惑自己。
W3C HTML BOM FAQ似乎表示标记文本是指在HTTP&#34;中标记的&#34;,即外部字符集标识,可能在HTTP Content-Encoding
标头中。因此,或许可以使用包含UTF-16LE
或UTF-16BE
的XML声明的BOM开头的XML文件。但我还没有看到这样的XML文件。
如果我使用带有XML文件的UTF-16LE BOM,1)我应该在encoding
属性中使用什么值,2)我的解析器应该自动检测哪个字符集作为文件的编码?
答案 0 :(得分:3)
理解这一点的关键是要认识到UTF-16编码方案不同于UTF-16LE和UTF-16BE。 UTF-16,小端,不是UTF-16LE。
请特别注意Unicode BOM常见问题解答中的最后一个问题中的第4点。如果编码为UTF-16BE或UTF-16LE,则不得使用BOM。您也可以参考Unicode标准中的3.10来获得这些“编码方案”的正式定义。
因此,如果您找到UTF-16的BOM,则编码为UTF-16,而不是UTF-16LE或UTF-16BE(两者都不允许有BOM)。如果没有BOM,则编码可以是三者中的任何一种,但在这种情况下,UTF-16基本上与BE和LE变体无法区分。但是,请注意,XML 1.1的4.3.3说“以UTF-16编码的实体必须以UTF-8编码的实体可以以字节顺序标记开头”。因此,对于XML,如果没有BOM,则编码不能是UTF-16(但可能是UTF-16BE或UTF-16LE)。