您的位置:寻梦网首页编程乐园XML 编程XML技术讲座
XML 编程

XML技术讲座之九

XML的字符编码

构成书面语言的基本元素,在拼音文字中被称为"字母",在象形文字中被称为"单字"。在计算机信息处理中,"字母"、"单字"和一些印刷及科学计算符号一起被统称为"字符"。计算机中的"字符"都是用一个二进制数字来表示的,这个二进制数字称为"字符"的编码。针对不同需求选择的"字符"集合,被称为某某字符集。对这些字符集进行不同的二进制编码,便形成了各种各样字符集编码。

XML标准规定,XML文件使用Unicode字符集编码。虽然Web是国际性的,但由于HTML对跨文种编码支持的不足,极大地限制了跨文种网页的制作和浏览。XML通过对双字节Unicode字符集和其压缩表示方式UTF-8、UTF-16提供完全支持,使Web的国际性在数据表现和数据交换层上真正得以实现,因为Unicode几乎包括了世界上所有现代语言通常使用的每一种字符。

下面我们就对Unicode以及XML对多文种的支持做一简单介绍。

Unicode简介

由于在计算机应用领域中存在着几十种互不相同的字符集,当在使用不同字符集的计算机系统之间进行信息交换时,人们可能会得到一些莫名其妙的东西(那些经常上网,经常不得不在各种字符编码之间来回切换的人对此可能深有感触)。紊乱的字符编码给信息交换以及软件开发商等带来了极大的不便。人们急需一种得到大家认可的并且涵盖了全世界各种文字的字符集。显然,建立这样的一种字符集是十分困难的。不过,这方面的努力一直在进行,Unicode就是这种努力的结果之一。

为了将成千上万的文字统一到同一个编码机制之下,在兼顾经济的原则下,不管是东方文字还是西方文字,在Unicode中一律用两个字节来表示。也就是说,Unicode是一种双字节编码机制的字符集,使用0-65535之间的双字节无符号整数对每个字符进行编码。这样,在Unicode字符集中,至少可以定义65536个不同的字符,足以应付目前绝大多数场合的需要。

目前,常用的Unicode编码方式有两种:UTF-8以及UTF-16。

UTF-8 是一种不等幅的编码方式,UTF-8编码的字节长度取决于所要编码的字符在ISO 10646中的编码值。在UTF-8中,不同的字符,可能需要1-6个字节来进行编码。对于单字节的UTF-8编码,该字节的最高位为0,其余7位用来对字符进行编码(等同于ASCII码)。对于多字节的UTF-8编码,如果编码包含n个字节,那么第一个字节的前n位为1,第一个字节的第n+1位为0,该字节的剩余各位用来对字符进行编码。在第一个字节之后的所有的字节,都是最高两位为"10",其余6位用来对字符进行编码。

UTF-16也是Unicode的变形表示方式的一种。它的目的是维持双八位的编码方式,同时也用一些特殊的双八位来表示ISO 10646中非基本多文种平面(BMP)中的一些字符。这种用来表示非BMP字符的方法在Unicode中称作代理对机制。

代理对的编码机制以及原先不需要代理对的六万三千多个基本 Unicode 码,合起来叫做UTF-16。也就是说UTF-16 基本上就是 Unicode双字节编码的实现,再加上一个应付未来扩充需要的编码机制。

UTF-16编码遵循下述原则:

  • 对于字符编码值小于0x10000的字符,则直接把编码值转化为一个相等的16位整数。
  • 对于字符编码值在0x10000到0x10FFFF之间的字符,将用一个0xD800到0xDBFF(代理高部)之间的16位数,后面紧跟一个0xDC00到0xDFFF(代理低部)之间的16位数来表示。
  • 字符编码值大于0x10FFFF的字符将不能用UTF-16来表示。

XML对多文种的支持

在XML1.0标准中规定,XML分析器必须支持以UTF-8或UTF-16编码的Unicode字符串,当XML声明中没有特别指明当前文档的编码方式(encoding)时,则一律以Unicode看待。分析器会自动识别出当前文档是UTF-8的还是UTF-16。也就是说,XML使用的缺省字符集是Unicode字符集。由于Unicode是一种通用字符集编码,因此,能够提供对多文种的支持。也就是说,在同一个XML文档中,几乎可以包含全世界的各种文字。

除非明确指出,否则XML 处理器假设XML文档是用 UTF-8 编码的。因为 UTF-8 包括作为子集的ASCII码,所以XML处理器也可以轻易地对ASCII文本进行语法分析。

除了 UTF-8, XML 处理器还要能够识别UTF-16。通过在文本实体的开端处寻找字节顺序记号,XML处理器可以辨认XML文档是UTF-8编码的还是UTF-16编码的。

如果不能把文本转变成UTF-8或者UTF-16,那么可以把文本用本地字符集代替,但是这时要告诉XML处理器是哪一种字符集。因为各种XML处理器不能保证处理其它编码形式,所以应该把这种方法作为一个最后的手段来使用。

为了提醒XML处理器正在使用非Unicode编码,可以在该文件开端的XML声明中包括一个encoding属性。例如,为了指定在缺省情况下整个文档使用GB2312(除非在嵌套实体中被另一个进程指令覆盖)编码,使用如下的XML声明:

< ?xml version = "1.0" encoding = "GB2312"? >

一个完整的小例子如下所示:
< ?xml version = "1.0" encoding = "GB2312"? >
< 测试 >
  XML可以支持多文种。这个例子使用的是中文。
< /测试 >
下表列出了当今使用的大多数常用字符集的规范名称,它们可以在XML的encodeing属性中给出。对于在列表中没有找到的编码形式,可以查询由Internet分配数字管理处(IANA)维护的正式列表http://www.isi.edu/in-notes/iana/assignments/character-sets

规范名称 语言国家
US-ASCII 英语
UTF-8 压缩的Unicode
UTF-16 压缩的UCS
ISO-10646-UCS-2 原Unicode
ISO-10646-UCS-4 原UCS
ISO-8859-1 Latin-1,西欧语言
ISO-8859-2 Latin-2,东欧语言
ISO-8859-3 Latin-3,南欧语言
ISO-8859-4 Latin-4,北欧语言
ISO-8859-5M ASCII加西里尔语言
ISO-8859-6 ASCII加阿拉伯语言
ISO-8859-7 ASCII加希腊语言
ISO-8859-8 ASCII加希伯来语言
ISO-8859-9 Latin-5,土耳其语言
ISO-8859-10 Latin-6,西欧
ISO-8859-13 Latin-7,ASCII码加波罗的海
周边语言和独特的拉托维亚语
ISO-8859-14 Latin-8,ASCII码
ISO-8859-15 Latin-9,Latin-10,西欧
ISO-2022-JP 日语
Shift-JIS 日文Windows
EUC-JP 日文Unix
Big5 汉语,中国台湾
GB2312 汉语,中国大陆
KOI8-R 俄语
ISO-2022-KR 朝鲜语
EUC-KR 朝鲜语,Unix
ISO-2022-CN 汉语

来源:网络世界