要了解“编码”属性,就必须了解bytes和characters的区别。
将字节视为 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 集合中,使用的最低值是 0,最高的是 127(这两个都是隐藏的控制字符)。
但是,一旦您开始需要比基本 ASCII 提供的字符更多的字符(例如,带有重音符号的字母、货币符号、图形符号等),ASCII 就不再合适,您需要更广泛的字符。您需要更多字符(不同的字符集)并且需要不同的编码,因为 128 个字符不足以容纳所有字符。某些编码提供一个字节(256 个字符)或最多六个字节。
随着时间的推移,已经创建了许多编码。在 Windows 世界中,有 CP1252 或 ISO-8859-1,而 Linux 用户倾向于使用 UTF-8。 Java 原生使用 UTF-16 [参见 cmets]。
一种编码中字符的一个字节值序列可能代表另一种编码中完全不同的字符,甚至可能无效。
例如,在 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 版就足够了。