XML标题中的“编码”有什么用?

看一下XML标题

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

我有权声明encoding属性是

  • 来得太晚(除非你知道编码,否则你不能正确阅读)
  • 多余的,因此很容易出错:用“Big5”replace它非常容易,但是将文件保存为UTF-8

还是那个属性不是关于stream的内容

我在这里混合的东西?

正如你所提到的,你必须知道文件的encoding才能读取encoding属性。

然而,有一个启发式,可以很容易地让你足够接近“真正”的编码,让你读取编码属性。 这是有效的,因为按照定义<?xml部分只能包含ASCII范围内的字符(但是它们是编码的)。

XML标准甚至描述了用于找出编码的确切过程 。

而编码标签也不是多余的。 例如,如果您使用XML规范中的algorithm来发现使用了一些基于ASCII(或ASCII兼容)的编码,则仍然需要阅读编码以确定哪一个实际使用(有效候选将是ASCII ,UTF-8,任何ISO-8859- *编码 ,任何Windows *编码, KOI8-R以及许多其他)。 对于<?xml部分本身而言,它不会有什么区别,但是对于文档的其余部分来说,这可能会产生巨大的差异。

关于错误标记的XML文件:是的,生成这些文件很容易:但是XML规范明确指出这些文件是错误的,因此是不正确的XML。 不正确的编码必须报告为错误(只要它们可被检测到!)。 所以这是谁在生产XML的问题。

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

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

我认为原则上你可能会有一个观点,即文件中的encoding语句是“迟到的”,但是整个第一行只使用基本字符。 AFAIK,在几乎所有的编码中都是一样的,所以无论你怎么解码,它都会读取<?xml ... ?>

无论如何然而,可能很重要。 例如,CDATA部分中的文本可以用西里尔文编码进行编码。