|
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编码遵循下述原则:
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。
来源:网络世界 |