- 的含义是什么? <?xml version="1.0" encoding="utf-8"?>

125
我是新手,正在学习XML基础知识。我在“学习XML”中读到下面这句话,但我还是不太明白。有没有人能指点我一本书或者网站,让我更清楚地了解这些基础知识?
从“学习XML”中得知:
XML声明描述文档的一些最常见属性,并告诉XML处理器需要XML解析器来解释此文档。
这是什么意思?
我理解xml版本部分 - 文档和文档的用户应该使用相同版本的XML进行交流。但是编码部分呢?为什么需要它?

1
http://www.w3.org/TR/xml/ - hakre
可能是XML头中的'encoding'有什么用处?的重复问题。 - Jonathan Leffler
5个回答

146

要理解"encoding"属性,你需要了解字节和字符之间的区别。

把字节看作是0到255之间的数字,而字符则是类似于"a"、"1"和"Ä"这样的东西。所有可用字符的集合称为一个字符集。

每个字符都有一个由一个或多个字节组成的序列来表示它;然而,字节数和值的确切数量取决于所使用的编码,并且有许多不同的编码。

大多数编码都基于一个叫做ASCII的旧字符集和编码,它是每个字符一个字节(实际上只有7位),包含128个字符,其中包括许多在美国英语中常用的字符。

例如,在ASCII字符集中,下面6个字符由值60到65来表示:

Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║  Character   ║
╠══════╬══════════════║
║  60  ║      <       ║
║  61  ║      =       ║
║  62  ║      >       ║
║  63  ║      ?       ║
║  64@       ║
║  65  ║      A       ║
╚══════╩══════════════╝

在完整的ASCII集中,使用的最低值为零,最高值为127(这两个都是隐藏控制字符)。

然而,一旦您需要比基本ASCII提供更多的字符(例如带重音符号的字母、货币符号、图形符号等),ASCII就不再适用,您需要更广泛的东西。您需要更多的字符(不同的字符集),并且您需要不同的编码,因为128个字符不足以容纳所有字符。一些编码提供一个字节(256个字符)或多达六个字节。

随着时间的推移,创建了许多编码。在Windows世界中,有CP1252或ISO-8859-1,而Linux用户倾向于使用UTF-8。Java原生使用UTF-16 [请参见注释]。

一个字符的字节值序列在一个编码中可能代表另一个完全不同的字符,甚至可能无效。

例如,在ISO 8859-1中,â由一个值为226的字节表示,而在UTF-8中,它是两个字节:195, 162。但是,在ISO 8859-1中,195, 162将成为两个字符Ã,¢

将XML视为不是一系列字符,而是一系列字节。

想象一下系统接收到的XML看到了字节195, 162。它如何知道这些字符是什么?

为了使系统将这些字节解释为实际字符(因此可以显示它们或将它们转换为另一种编码),它需要知道XML中使用的编码。

由于大多数常见编码与ASCII兼容,只要涉及基本的字母字符和符号,对于这些情况,声明本身就可以仅使用ASCII字符说明编码。在其他情况下,解析器必须尝试确定声明的编码。因为它知道声明以<?xml开头,所以这样做会容易得多。

最后,version属性指定XML版本,目前有两个版本(请参阅维基百科XML版本)。版本之间存在细微差异,因此XML解析器需要知道它正在处理的内容。在大多数情况下(至少对于英语用户而言),版本1.0就足够了。


9
标题本身使用ASCII编码:我认为您指的是XML声明。它的编码方式与文档的其余部分相同,可能是UTF-16或其他格式。XML处理器可以尝试几次,直到它能够读取编码规范为止。 - Tom Blodget
1
我曾经认为前导/序言应该使用UTF-8编码,并且告诉解析器如何将其余的字节(实际的XML文档)转换为正确的编码。但是,我错了! :-) - Kelly Beard
5
以下是一篇建议阅读的文章:https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/该文章介绍了关于 Unicode 和字符集的基本知识,这对于软件开发人员来说是必不可少的。它强调了在处理文本时需要注意的常见错误,并提供了解决这些错误的实用建议。无论你是初学者还是经验丰富的开发人员,都应该花时间仔细阅读这篇文章,以避免这些普遍问��带来的麻烦。 - Sudip Bhandari
1
自从Java 9推出了紧凑字符串(JEP 254)之后,“Java本地使用UTF-16”这一说法不再总是成立。 - EndlosSchleife

7

这是XML的可选前导部分。

  • version="1.0" 表示此文件遵循的XML标准为1.0版本
  • encoding="utf-8" 表示该文件使用UTF-8 Unicode编码进行编码

4

3
请指点我一本书或者一个网站,以便我能够清晰地了解这些基础知识。
你可以查看这个 XML 教程 ,其中包含示例。
那么编码部分呢?为什么需要编码?
W3C 提供了有关编码的 解释
“XML 和 HTML 4.0 的文档字符集是 Unicode(又称 ISO 10646)。这意味着 HTML 浏览器和 XML 处理器应该在内部使用 Unicode。但这并不意味着文档必须以 Unicode 方式传输。只要客户端和服务器就编码达成一致,它们可以使用任何可以转换为 Unicode 的编码...”

-1
文档映射中的XML声明包括以下内容:
The version number, ?xml version="1.0"?. 

这是必须的。虽然XML的未来版本可能会更改该数字,但1.0是当前版本。

编码声明,

encoding="UTF-8"?

这是可选的。如果使用,则编码声明必须紧接着 XML 声明中的版本信息出现,并且必须包含表示现有字符编码的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接