xml - XML声明中的默认编码(UTF-8)如何默认?

标签 xml utf-8

我知道the default encoding of XML is UTF-8。所有XML使用者必须(MUST)等等。因此,这不仅仅是XML是否具有默认编码的问题。

我也知道文档开头的the XML-Declarataion <?xml version="1.0" ... ?> 是可选的。并且在其中指定编码的内容也是可选的。

因此,我问自己以下两个XML声明是否是完全相同的两个表达式:

<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>

根据我目前的理解,我会说这些是等效的,但我不知道。
是否在某处指定了这两个声明的等效项?

(考虑这两行示例,每行都是XML文档的第一行,后跟任意(零个)字节,并经过UTF-8编码)

最佳答案

简短答案

在没有外部编码信息的UTF-8编码文档的非常特殊的情况下(我从注释中了解到您感兴趣的是该信息),这两个声明之间没有区别。

长答案虽然有趣得多。

规范说明

如果查看Appendix F1 of the XML specification,它将说明在没有外部编码信息的情况下确定编码所应遵循的过程。

如果文档被编码为UTF变体之一,则解析器应该能够从字节顺序标记或XML声明的开始检测前4个字节内的编码。

但是,根据规范,它仍应读取编码声明。

In cases above which do not require reading the encoding declaration to determine the encoding, section 4.3.3 still requires that the encoding declaration, if present, be read and that the encoding name be checked to match the actual encoding of the entity.



如果不匹配,则根据section 4.3.3:

...it is a fatal error for an entity including an encoding declaration to be presented to the XML processor in an encoding other than that named in the declaration



编码的UTF-16,声明为UTF-8

让我们看看当我们创建一个编码为UTF-16但编码声明设置为UTF-8的XML文档时会发生什么。

Opera,Firefox和Chrome浏览器都将文档解释为UTF-16,而忽略了编码声明。 Internet Explorer(至少为版本9)显示空白文档,但没有实际错误。

因此,如果您在UTF-8文档中包含UTF-8编码声明,并且稍后有人将其转换为UTF-16,它将在大多数浏览器中都可以使用,但在IE中会失败(而且,我认为大多数Microsoft XML蜜蜂)。如果您保留了编码声明,那么您会没事的。

从技术上讲,我认为IE是最准确的。它不显示错误的事实可以由以下事实解释:错误发生在编码级别而不是XML级别。假定尽其所能将UTF-16字符解释为UTF-8,但未找到任何可解码的字符,最终将空字符序列传递给XML解析器。

编码的UTF-8,否则声明为

您现在可能会认为Firefox,Chrome和Opera只是完全忽略了编码声明,但并非总是如此。

如果将文档编码为UTF-8(带有字节顺序标记,因此它与其他内容毫无区别),但是将编码声明设置为Latin1,则所有浏览器都会成功将内容解码为Latin1,而忽略UTF-8 BOM。

再次对我来说这似乎是对的。 BOM字符在Latin1中无效的事实只是意味着它们在字符解码级别被静默删除。

但是,这不适用于UTF-8文档上的所有声明的编码。如果声明的编码为UTF-16,我们将返回Opera,Firefox和Chrome,而忽略声明的编码,而Internet Explorer返回一个空白文档。

本质上,任何使IE返回空白文档的事情都会使其他浏览器忽略声明的编码。

其他不一致之处

还值得一提的是字节顺序标记的重要性。根据section 4.3.3 of the spec:

Entities encoded in UTF-16 MUST [...] begin with the Byte Order Mark



但是,如果您尝试阅读不带BOM的UTF-16编码XML文档,那么大多数浏览器仍会将该文档视为有效。仅Firefox将其报告为XML解析错误。

外部编码信息

到目前为止,我们一直在考虑当没有外部编码信息时会发生什么,但是,正如其他人提到的那样,如果通过HTTP接收文档或将其封装在某种MIME信封中,则来自这些来源的编码信息应优先于文档编码。

各种XML MIME类型的大多数详细信息在RFC3023中进行了描述。但是,实际情况与指定的情况有所不同。

首先,具有省略的charset参数的text/xml应该使用US-ASCII的字符集,但是几乎总是忽略了这一要求。浏览器通常将使用XML编码声明的值,如果没有,则默认使用UTF-8。

其次,如果文档上有一个UTF-8 BOM,并且XML编码声明为UTF-8或未包括在内,则该文档将被解释为UTF-8,而与Content-Type中使用的字符集无关。

仅当没有BOM且在Content-Type中指定了显式字符集时,似乎才优先使用Content-Type的编码。

无论如何,在任何情况下(涉及Content-Type),在UTF-8文档上包括UTF-8 XML编码声明与根本没有编码声明有什么不同。

关于xml - XML声明中的默认编码(UTF-8)如何默认?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16361909/

相关文章:

php - SimpleXML,请不要扩展实体

java - XML 解析 - 搜索特定元素

xml - XSLT 2.0 : Substring-after on a for-each loop to get distinct-values

java - XMLBeans - 如何处理几乎相同的遗留 XSD?

php - 如何正确保存和显示表情符号推文,如\udc3b

android - 我有哪些选项可以显示 Android 无法显示的字符?

java - 如何通过 XPATH 更新 Java 中需要不同值的多个节点?

javascript - 在 PDF 中显示 UTF-8 字符

iphone - 核心数据和特殊字符(UTF-8)

java.nio.file.InvalidPathException : Malformed input or input contains unmappable characters when using national characters