XML头中的'encoding'有什么用?

时间:2011-03-02 09:05:08

标签: xml header character-encoding

查看XML标头

<?xml version="1.0" encoding="UTF-16" standalone="no"?>

我是否正确地声明encoding属性是

  • 来得太晚了(除非您知道编码,否则无法正确阅读)。
  • 冗余,因此容易出错:用“Big5”替换它然后用UTF-8保存文件太容易了

或者该属性不是关于流的内容吗?

我在这里混淆了什么吗?

4 个答案:

答案 0 :(得分:41)

正如您所提到的,您必须知道文件的编码才能阅读encoding属性。

但是,有一种启发式方法可以让您足够接近“真实”编码,以便您阅读编码属性。这是有效的,因为根据定义<?xml部分只能包含ASCII范围内的字符(但它们是编码的)。

XML标准甚至describes the exact process used to find out the encoding

编码标签也不冗余。例如,如果您使用XML规范中的算法来找出使用某些基于ASCII(或ASCII兼容)的编码,那么仍然需要读取编码以找出实际的编码使用(有效候选者将是ASCII,UTF-8,任何ISO-8859-* encodings,任何Windows-*编码,KOI8-R以及许多其他人。对于<?xml部分本身而言它不会产生什么影响,但对于文档的其余部分,它可以产生巨大的差异。

关于错误标记的XML文件:是的,很容易生成这些文件,然而:XML规范明确规定这些文件格式错误,因此不是正确的XML。必须将不正确的编码报告为错误(只要可以检测到它们!)。所以这就是生成XML的人的问题。

答案 1 :(得分:6)

你说它看起来像一个奇怪的设计是对的。它只能起作用,因为XML声明只使用ASCII字符,几乎所有编码都是ASCII的超集。如果你准备接受不是的东西,例如EBCDIC,你可以检查文件是否以"<?xml"的EBCDIC表示开头。这意味着您依赖于文件头中的一般冗余级别,而不是纯粹的编码属性本身。像XML中的许多东西一样,它实用且有效,但并不是特别优雅。

答案 2 :(得分:2)

XML解析器只需要支持至少UTF-8和UTF-16。 XML解析器首先尝试基于字节顺序标记(BOM)的编码(如果存在)(对于带有虚拟BOM的UTF-16,UTF-32甚至UTF-8)。如果没有找到,则解析器将尝试UTF-32,UTF-16,UTF-8,ASCII和其他ASCII兼容的单字节编码。只有这样它才能看到编码属性,并在必要时重新开始解析。

答案 3 :(得分:0)

我认为原则上你可能会指出encoding语句在文件中是'迟到',但是,整个第一行只使用基本字符。 AFAIK,几乎所有编码都是相同的,所以无论你解码它,它都会读<?xml ... ?>

无论之后发生什么,都很重要。例如,CDATA部分中的文本可以用西里尔语编码进行编码。