【问题标题】:What use is the 'encoding' in the XML header?XML 标头中的“编码”有什么用?
【发布时间】:2011-03-02 09:05:07
【问题描述】:

查看 XML 标头

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

我可以说encoding 属性是

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

或者该属性与流的内容无关?

我在这里搞混了吗?

【问题讨论】:

标签: xml header character-encoding


【解决方案1】:

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

【讨论】:

  • 如果你能引用你的消息来源,我会 +1。
【解决方案2】:

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

但是,有一种启发式方法可以很容易地让您足够接近“真实”编码,从而允许您读取编码属性。这是可行的,因为根据定义,&lt;?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 以及许多许多其他编码)。对于&lt;?xml 部分本身,它是哪一个不会有什么不同,但对于文档的其余部分,它可以产生巨大的差异。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • &lt;?xml 在 EBCDIC 4C 6F A7 94 93。但是,并非所有 EBCDIC 代码页都以相同的方式编码 ":代码页 1026 使用 FC,而大多数其他代码页使用 7F,因此您必须同时查找两者。
    【解决方案4】:

    我认为原则上您可能会认为encoding 语句在文件中是“迟到的”,但是,整个第一行仅使用基本字符。 AFAIK,几乎所有的编码都是一样的,所以不管你怎么解码,它都会读到&lt;?xml ... ?&gt;

    之后发生的任何事情都可能很重要。例如,CDATA 部分中的文本可以用西里尔文编码进行编码。

    【讨论】:

    • 这并不完全正确:UTF-16 (LE/BE)、UCS-2、UCS-4 和 EBCDIC 都是编码这些基本字符的合法编码与 ASCII 相同。但是,XML 规范中描述的算法很好地说明了如何找出使用的编码系列。
    猜你喜欢
    • 2014-11-05
    • 2011-08-05
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2012-03-14
    • 2013-01-28
    • 2016-01-27
    • 2012-05-08
    相关资源
    最近更新 更多