从“学习XML”中得知:
XML声明描述文档的一些最常见属性,并告诉XML处理器需要XML解析器来解释此文档。
这是什么意思?
我理解xml版本部分 - 文档和文档的用户应该使用相同版本的XML进行交流。但是编码部分呢?为什么需要它?
要理解"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就足够了。
这是XML的可选前导部分。
version="1.0"
表示此文件遵循的XML标准为1.0版本encoding="utf-8"
表示该文件使用UTF-8 Unicode编码进行编码编码声明确定文档中的字符使用哪种编码表示。
有关 XML 声明的更多信息,请参见:http://msdn.microsoft.com/en-us/library/ms256048.aspx
The version number, ?xml version="1.0"?.
这是必须的。虽然XML的未来版本可能会更改该数字,但1.0是当前版本。
编码声明,
encoding="UTF-8"?
这是可选的。如果使用,则编码声明必须紧接着 XML 声明中的版本信息出现,并且必须包含表示现有字符编码的值。