XML学习笔记(上)"/>
7.2. Unicode
计算机并不能正真理解文本内容,它无法识别诸如a,b,c这类的字母,更不用说中文了。计算机所能理解的只有数字,如60,80等。字符集(character set)规定了字母到数字的映射关系,如65代表大写字母A。65称为码点(code point),字符编码(character encoding)决定码点如何用字节表示。是用多了节还是单字节,高字节位表示什么,低字节位表示什么。
不同国家使用不同的语言,不同程序使用不同的编码规范,在进行世界范围内的数据交换就要统一表示数据的字符编码规范。传统的ASCII字符集只定义了127个字符,其中前31个是控制符。127位之后的字符随平台不同而不同。大多数平台只能表示前127位,单字节(8位),使得字符集中最多只能提供256个字符。这些标准字符称为罗马或拉丁字符集,用ASCII来表示中文、日文是远远不够的。
为了解决字符集问题,出现了Unicode字符集。它可用多字节格式编码字符,目前标准允许2字节字符,支持65536个不同字符。标准的Unicode字符集为Latin-1(或ISO-8859-1)。有关Unicode的介绍可访问Unicode的官方网站:http://www.ringkee.com/jims/technic_folder/linux/
Unicode字符集为字符分配码点,即编号。这些编号可以用多种模式编码,如UCS-2、UCS-4、UTF-8、UTF-16。
UCS-2,也叫ISO-10646-UCS-2。每个字符用一个0~65535之间的两个字节的无符号整数表示。如A的Unicode码点为65,用两个字节00和41(十六进制)表示。B的Unicode码点为66,用两个字节00和42表示。UCS-2有两种形式:高字节(#x0041)在前和低字节(#x4100)在前。为区发高低位不同表示形式,采用UCS-2编码文档通常以Unicode字符#xFEFF(零宽度无间断空格)开头,一般称为字节顺序标记(byte order mark)。这个字符是不可见的。如果两个字节交换位置,得到的字符#xFFFE实际是不存在的。因此中通过查看UCS-2文档的前两个字符是#xFEFF还是#xFFFE,就可确定该文档是否是高字节在前。UCS-2的缺点:如果文本字符主要是拉丁文,由于采用两个字节,字符集编码是单字节字符编码的两倍;UCS-2不能与ASCII向前或向后兼容,用于单字节字符集的工具常常不适用于处理UCS-2编码文件。
UTF-8是一种可这长度的Unicode编码。0~127为ASCII码字符集,与ASCII编码完全兼容,每个字符采用一个字节编码。UTF-8用两个字节表示128~2047,该范围覆盖了最常见的非表意字母。其余的字符,主要来自汉语、日语和韩语,每个都用3个字节表示。如果Unicode的码点超过65535个字符,那么这些字符就会用4个字节编码。对于以拉丁文为主的文件,使用UTF-8比UCS-2可减少一半的文件大小。对于汉语、日语和韩语的文件,其大小会增加百分之五十。对于其它语言,文件大小相差不大。UTF-8是最常用的Unicode编码方式。
在Unicode流行以前,出现了一系列处理特定语言的单字节字符集,ISO将14种这样的字符集标准化成ISO 8859标准,分别是ISO-8859-1~14。ISO-8859-15是ISO-8859-1的修订版本。这些字符集统称ISO字符集。
Cp1252是依赖于Windows平台的一种编码,是Windows的缺省字符集。该种编码不支持跨平台特性,尽量不要使用。
MacRoman是Mac OS使用的一种非标准、单字节编码。在非Mac平台下使用也会有问题,尽量不要使用。
在XML文档中,如果需输入编辑器不支持的字符,我们可用字符引用的方式,以十进制或十六进制给出它所代表的Unicode字符编号,如њ(十进制)或者њ(十六进制)。字符引用可用于元素内容、属性和注释,不能用于元素名和属性名、处理指令或XML关键字。如果有一些字符需经常使用,则我们可为这些字符定义实体,这样,在文档中就可方便地引用该实体了。专门定义字符实体的DTD我们可独立出来,形成以.ent为后缀的外部DTD。在需要时使用外部参数实体引用将这些定义引入文档的DTD中。
XHTML 1.0 DTD包含有三个有用的字符引用实体可在文档中使用。
Latin-1字符,http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
ISO-8859-1中自160以上的非ASCII码字符。
特殊字符,http://www.w3.org/TR/xhtml/DTD/xhtml-special.ent
ISO-8859-2中不在Latin-1中的字母。
标点符号,http://www.w3.org/TR/xhtml-symbol.ent
希腊字母表(不包含带重音的字符)和各种标点符号、数学运算符及其他数学中常用的符号。
在XML文档中可以使用xml:lang属性规定元素内容采用的语言。这样就可在一篇文档中同时使用多种语言,这是XML跨平台和跨语言的重要特性之一。如:xml:lang="CN-CHN"。语言代码是一个两个字母的语言代码,语言代码后还可跟一个子代码,语言代码可在这里找到http://ftp.ics.uci.edu/pub/ietf/http/related/iso3166.txt。下面是xml:lang属性声明的示例:
<!ELEMENT test (#PCDATA)>
<!ATTLIST test xml:lang NMTOKEN #IMPLIED>
由于所有语言代码都是有效的XML名称标记,所以使用NMTOKEN类型。
Appendix A. 附录
Table of Contents
A.1. 标记语言的历史
A.2. XML相关技术名词解释
A.3. XML应用
A.1. 标记语言的历史
1974年,IBM的Charles F.Goldfarb、Ed Mosher和Ray Lorie发明了一种最终发展成为标准的通用标记语言(SGML,Standardized General Markup Language)。1986年,SGML被ISO采用为8879号标准。
1991年,Tim Berners-Lee利用SGML提供的基本机制定义了超文本标记语言(HTML,Hypertext Markup Language),把Internet带进了一个多姿多彩的世界。HTML是SGML最成功的一种应用。
1998年2月10日,W3C的XML 1.0标准正式发布,为异构平台的数据交换提供了一个可行的标准。
A.2. XML相关技术名词解释
XLink,一种基于属性的用于XML和非XML文档之间超链接的语法,可以提供与HTML相似的简单、单向的链接,多文档之间的多向链接,以及没有写入权限的文档间的链接。
XSLT(XSL Transformation,XSL转换),一种XML文档,用于描述具有相同或不同XML词汇表的两个文档之间的转换。
XSL-FO(XSL Formatting Object,XSL格式化对象),一种用于描述打印和网页布局的XML应用。
Dsssl(Document Style Sheet and Semantics Language,文档样式表和语义语言),用于描述XML打印和在Web上的样式,源自SGML。
XPointer,标识XML文档中由URI指定的特殊部分,通常与XLink结合使用。
XPath,用于标识XML文档中的路径。
Namespace,区分来自不同的XML语汇表但名称相同的元素和属性的一种方式。
SAX,Simple API for XML,一种事件驱动的XML文档处理器。
DOM,Document Object Model,一种面向树的API,它把XML文档解释成具有多属性和嵌套的对象树。
A.3. XML应用
XML可自定义标签,为了增强互操作,个人或组织可约定只使用某种标签。这些标签集被称为XML应用。XML应用不是使用XML的软件应用程序,如IE或Word,而是XML在矢量图形或数学公式这些特殊领域的一种应用。
SVG,可缩放矢量图形(Scalable Vector Graphic),是W3C推荐的XML中矢量图的编码标准。
MathML,数学标记语言(Mathematical Markup Language),用于表示数据公式。
CML,化学标记语言(Chemical Markup Language),描述化学、物理学、分子生物学和其它分子科学。
RDF,资源描述框架(Resource Description Framework),用于描述资源,特别是图书馆分类卡上的元数据。
CDF,通道定义格式(Channel Definition Format),微软公司定义的一种非标准XML应用,用来向IE发布可离线浏览的网页。