首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XML声明中的默认编码(UTF-8)是如何默认的?

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

Stack Overflow用户
提问于 2013-05-03 14:57:47
回答 4查看 13.1K关注 0票数 12

我知道XML的默认编码是UTF-8。。所有XML使用者都必须如此等等。因此,这不仅仅是一个XML是否具有默认编码的问题。

我还知道,文档开头的是可选的。指定其中的编码也是可选的。

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

代码语言:javascript
运行
复制
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>

根据我目前的理解,我会说这些是等同的,但我不知道。这两种声明的等价性是否在某个地方被指定了?

(假设这两行示例分别是XML文档的第一行,前面有任何(零)字节和UTF-8编码)

EN

回答 4

Stack Overflow用户

发布于 2013-05-06 18:02:16

,简短的答案,

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

然而,长篇大论的答案要有趣得多。

,Spec说什么,

如果您查看XML规范的附录F1,这说明了在没有外部编码信息时确定编码所应遵循的过程。

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

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

在以上不需要读取编码声明以确定编码的情况下,第4.3.3节仍然要求读取编码声明(如果存在),并检查编码名称以与实体的实际编码相匹配。

如果它们不匹配,根据第4.3.3节的说法

对于包含编码声明的实体来说,...it是一个致命错误,它将以声明中指定的编码以外的编码方式呈现给XML处理器。

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

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

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

因此,如果您在UTF-8文档中包含了UTF-8编码声明,并且稍后某个人将其转换为UTF-16,那么它将在大多数浏览器中工作,但在IE中失败(我猜想,大多数Microsoft XML API)。如果您离开了编码声明,您就会没事。

从技术上讲,我认为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,忽略声明的编码,而则返回一个空白文档。

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

其他不一致

这也值得一提的是拜德教令马克的重要性。根据规范第4.3.3节

以UTF-16编码的实体必须..。从Byte命令开始

但是,如果您尝试读取没有BOM的UTF-16编码的XML文档,那么大多数浏览器仍然会接受它为有效的。只有Firefox将其报告为XML解析错误。

外部编码信息

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

各种XML类型的大部分细节都是用RFC3023描述的。然而,实际情况与具体情况略有不同。

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

第二,如果文档上有UTF-8 BOM,并且XML编码声明是UTF-8或不包括,则文档将被解释为UTF-8,而不管内容类型中使用的字符集如何。

只有当没有BOM,并且在Content中指定了显式字符集时,内容类型中的编码才是优先的。

无论如何,在UTF-8文档中包含UTF-8 XML编码声明与根本没有编码声明是完全不同的(涉及内容类型)。

票数 15
EN

Stack Overflow用户

发布于 2013-05-03 15:28:44

孤立地说,两者是等同的。您已经引用了规范的相关部分,这些部分表明这两种声明都是等价的。

但是,XML可以有一个信封,例如header。W3C指定表示,该信封信息比文件中的任何其他声明都具有优先级。因此,例如,如果您通过http检索XML,您可能会得到以下内容:

代码语言:javascript
运行
复制
HTTP/1.1 200 OK
Content-Type: text/xml

<root/>

在这种情况下,XML应该被读取为ascii,因为text/* mime类型的默认字符集是ascii。这就是为什么您应该使用application/xml mime类型-这些默认为utf-8。“应用程序”前缀意味着相关的应用程序规范定义了诸如默认编码之类的内容。(即XML规范接管。)对于text/* mime类型,默认为ascii,charset参数必须包含在mime类型中才能更改字符集。

这是另一个案例:

代码语言:javascript
运行
复制
HTTP/1.1 200 OK
Content-Type: text/xml; charset=win-1252

<?xml version="1.0" encoding="utf-8"?>
<root/>

在这种情况下,符合标准的XML处理器应该将该文件读取为win-1252,而不是utf-8

另一个案件:

代码语言:javascript
运行
复制
HTTP/1.1 200 OK
Content-Type: application/xml

<?xml version="1.0" encoding="win-1252"?>
<root/>

这里的编码是win-1252

代码语言:javascript
运行
复制
HTTP/1.1 200 OK
Content-Type: application/xml; charset=ascii

<?xml version="1.0" encoding="win-1252"?>
<root/>

这里的编码是ascii

票数 8
EN

Stack Overflow用户

发布于 2013-05-03 15:48:36

如果第二次声明是在已经检测到的具有与UTF-8不兼容的编码(例如UTF-16)的文档开始时到达的,那么第二次声明被拒绝是不合理的。但是,考虑到您的声明,即文档是UTF-8编码的,他们将如何被对待之间没有区别。

在这两种情况下,外部指定的编码都是优先的;这两个文档仍将得到相同的处理。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16361909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档