XML Spec and UTF-16

7

XML 1.0规范附录F第4.3.3节讨论了UTF-16、UTF-16编码数据流中的字节顺序标记(BOM)和XML编码声明。从这些部分的信息来看,UTF-16文档需要一个字节顺序标记。但是,在附录F的总结表中,给出了一个UTF-16输入不具有字节顺序标记但具有XML声明的情况。根据第4.3.3节,UTF-16编码的文档不需要编码声明(在这种情况下,XML声明本身也是可选的)。

根据这些信息,如果文档的其余部分都是良好形式的,那么既没有BOM也没有XML声明的UTF-16 xml文档是否被认为是良好形式的?


4.3.3节似乎表明它不是,但附录F的图表使其变得不清楚。 - Mike Menzel
Unicode从未规定BOM是必需的。这是您可能对客户做的最糟糕的事情,但创建只能由您自己的应用程序正确读取的文件的权利是确定的。这确保了您的客户依赖于您,有利于业务。 - Hans Passant
1个回答

9
根据Unicode 6.2规范(第99页),“UTF-16编码方案可能具有BOM,也可能没有。但是,在缺少更高级别协议的情况下,如果没有BOM,则UTF-16编码方案的字节顺序为big-endian。”因此,在UTF-16文档中不需要BOM。但是,可能会有“更高级别的协议”,例如XML规范,用于指示如何处理没有BOM的UTF-16 XML文档。XML 1.0规范的第4.3.3节指出:“以UTF-16编码的实体必须以由[ISO/IEC 10646:2000]的Annex H和[Unicode]的第16.8节(零宽度不间断空格字符#xFEFF)描述的字节顺序标记开头,以UTF-8编码的实体可以以此开头。” 回到上面的问题。附录F描述了在没有BOM的情况下检测字符编码的方法。但是,我认为该部分与您的问题无关,因为您正在询问是否可以在没有BOM和XML声明的UTF-16 XML文档中“良好地形成”,而附录F是规范的非规范部分。 因此,根据规范,如果“作为一个整体,它与标记为document的产生物相匹配”(第2.1节),则文档是良好的形式。回顾document,可以看到XML声明是可选的(这也在第2.8节中提到)。因此,可以有一个没有XML声明的良好形式的文档;这回答了您问题的一半。另一半是关于没有XML声明但也没有BOM的UTF-16 XML文档是否仍然可以良好地形成。根据第4.3.3节的规定(强调我):“在没有外部传输协议(例如HTTP或MIME)提供的信息的情况下,对于以编码声明为特征的实体以外的编码呈现给XML处理器是致命错误,或者对于既不以字节顺序标记开头也不以编码声明开头的实体使用除UTF-8之外的编码。” 基于此,在缺少外部信息的情况下,没有BOM和编码声明(作为XML声明的一部分)的UTF-16 XML文档不是一个良好的形式的文档(因为致命错误违反了良好形式性,在第1.2节中定义了良好形式约束的定义)。这也符合第4.3.3节早期关于UTF-16需要BOM的要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接