要理解"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版本,目前有两个版本(请参阅Wikipedia XML versions . 版本之间存在细微差别,因此XML解析器需要知道它正在处理什么 . 在大多数情况下(对于说英语的人)无论如何),版本1.0就足够了 .