XML编码声明和字节顺序

时间:2014-08-25 01:14:54

标签: java xml parsing character-encoding

我整理了一些我真正旧的Java代码,在XML解析包含在JDK库之前写入XML规范的第一版,并尝试将其更新并编写一些试验。特别是我(重新)实现了这样的XML character encoding autodetection

  1. 我读了BOM,如果有的话。
  2. 如果没有BOM,我会&#34; impute&#34;基于XML声明的预期<?xml开始的BOM。
  3. 我现在有足够的信息(每个字符的字节数,字节序等)来阅读encoding=声明,如果有的话,根据XML规范可能会告诉我一些更具体的或深奥的编码
  4. 所以,让我们说该文件有一个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-16LEUTF-16BE的XML声明的BOM开头的XML文件。但我还没有看到这样的XML文件。

    如果我使用带有XML文件的UTF-16LE BOM,1)我应该在encoding属性中使用什么值,2)我的解析器应该自动检测哪个字符集作为文件的编码?

1 个答案:

答案 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)。