在JDK库中包含XML解析之前,我正在整理一些非常老的Java代码,这些代码写到XML规范的第一版,并试图更新它并编写一些测试。特别是,我正在(重新)实现这样的XML 字符编码自动检测:
<?xml声明的开始来“推断”BOM。encoding=声明(如果有的话),根据XML规范,它可能会告诉我一些更具体或更深奥的编码。因此,假设该文件有一个用于UTF-16LE的实际BOM。XML属性的值应该是什么?应该是encoding="UTF-16LE"吗?但是Unicode Byte命令标记FAQ似乎表明,如果一个UTF-16家庭BOM存在,我应该“标记文本”为仅仅UTF-16。这是否意味着我应该在我的XML文件中使用encoding="UTF-16"?但是,我的解析器是否应该忽略encoding值,而使用它从BOM中确定的更具体的字符集呢?我开始迷惑自己了。
W3C HTML常见问题似乎表明,标记文本是指“在HTTP中标记”,即外部字符集指定,大概在header中。因此,也许可以让一个以BOM开头的XML文件包含UTF-16LE或UTF-16BE的XML声明。但是我还没有看到这样的XML文件。
如果我在XML文件中使用一个UTF-16LEBOM,1)我应该在encoding属性中使用什么值,2)解析器应该自动检测什么字符集作为文件的编码?
发布于 2014-09-02 16:20:39
理解这一点的关键是认识到UTF-16编码方案不同于UTF-16 to和UTF-16 to。UTF-16,小endian,不是UTF-16 is。
注意,特别是Unicode BOM常见问题中最后一个问题的第4点。如果编码是UTF-16 be或UTF-16 be,则不能使用BOM。对于这些“编码方案”的正式定义,您也可以参考Unicode标准中的3.10。
因此,如果您找到UTF-16的BOM,编码是UTF-16,而不是UTF-16 to或UTF-16 to(两者都不允许有BOM)。如果没有BOM,编码可能是这三种中的任何一种,尽管在这种情况下,UTF-16基本上与be和LE变体没有区别。但是,请注意,XML1.1中的4.3.3说“在UTF-16中编码的实体必须和在UTF-8中编码的实体可以以Byte Order Mark开头”。因此,对于XML,如果没有BOM,那么编码就不能是UTF-16 (但可能是UTF-16 be或UTF-16 be )。
https://stackoverflow.com/questions/25477854
复制相似问题