返回首页
当前位置: 主页 > 航空资料 > 计算机 >

XML高级编程上(17)

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin 点击:
  
与大多数X M L属性不同,这些必须按上面的顺序依次出现。另一方面,也是与大多数X M L
属性不同,e n c o d i n g属性值不是大小写敏感的。这种不一致主要是因为X M L对现有I S O和I A N A
标准关于字符编码命名的依赖。
针对X M L的、支持最广泛的字符编码包括:
• 统一代码:“U T F - 8”,“U T F - 1 6”
• ISO 10646:“I S O - 1 0 6 4 6 - U C S - 2”,“I S O - 1 0 6 4 6 - U C S - 4”
• ISO 8859:“I S O - 8 8 5 9 - n”(其中的n代表数字1到9)
• JIS X-0208-1997:“I S O - 2 0 2 2 - J P”,“S h i f t - J I S”,“E U C - J P”
虽然H T T P为服务器联络客户端(浏览器)提供了一种方法,编码的作用也正在于此,但有
时候并没有服务器的存在(比如在我们察看本地文件系统上的文件时)。使用e n c o d i n g属性也比
试图依靠自动检测字符编码要可靠得多,后者已经很常见,但无法区分U T F - 8和I S O - 8 8 5 9 - 1,也
不能可靠地检测出U T F - 7编码。
下面,我们再细致地了解一下编码的意义。
(1) 字符编码
统一代码原本是设计成一个简单的1 6位的标量值集合,因为它要包含任何现代语言必需的
大多数特殊符号或字符。尽管这65 536个字符并没有全部用上,但很明显需要的字符会越来越多,
而统一代码也增加了代理块( surrogate block)机制来增加1 048 576个额外字符(稍后我们将详
细阐述)。
虽然统一代码使用标量值识别字符,但存储这些数字还是有不同的办法。X M L需要在网络
中广泛使用的设计目的要求有各种各样的编码方法。
U T F - 8能够正常地处理7位的A S C I I码,但对于其他任何内容都需要2到8个字节(每个的变
化范围都是从8 0到F F)—对于占统治地位的A S C I I文本来说相当不错,但对于除此之外的事物
来说则不是什么好消息。由于U T F - 8对非A S C I I数据支持不够,而且J a v a是构建在统一代码字符
集之上,所以对于国际化的应用来说, U T F - 8并不是一个好的选择。“U T F”意味着“统一代码
传输格式”(在统一代码文档中是这样描述的),或者“ U S C传输格式”(在ISO 10646中是这样
描述的)。
第2章XML 语法使用39
下载
U T F - 1 6编码最为简单,它用两种传统方式(大尾数法和小尾数法)中的一种来存储1 6位的
字符(这取决于计算机处理器的体系结构)。
其他字符可能使用代理块(参见下节)编码。对U T F - 1 6的关注主要来自东亚,在那里有时
需要用两个编码单元来表示一个字符。但是,亚洲字符当中的绝大部分都只需要一个编码单元。
根据统一代码FA Q,代理对的使用要比所有文本存储的1 %少许多。所以,大多数构造于统一代
码之上的软件使用的都是U T F - 1 6编码。
U T F - 3 2编码(几乎等同于ISO 10646 UCS-4编码)可以简化编程工作—所有的统一代码字
符(以及大约4 0亿个附加字符)能够使用这种方法编码。虽然对于某些语言/平台来说能够简化
编程,但这并不是一种理想的选择,因为用这种编码每个字符还是需要双倍的存储空间(也就
是A S C I I字符存储空间的四倍)。
ISO 10 646和统一代码之间的关系在h t t p : / / c o n s u l t . c e r n . c h / c n l / 2 1 5 / n o d e 4 7 . h t m l有详细描述,I S O
8 8 5 9也在h t t p : / / p p e w w w. p h . g l a . a c . u k / ~ f l a v e l l / i s o 8 8 5 9 / i s o 8 8 5 9 - p o i n t e r s . h t m l有相关的讨论。
(2) 代理块
很明显,65 536个字符可能足够支持大多数现代语言,满足学者和历史学家的需要,具备表
现语言充满活力的天性,但同时它也需要更大的空间。例如,统一代码添加了大约14 500个复合
字符以兼容现有的字符集;此外还有许许多多数学符号、亚洲象形文字、历史字符没有包含在
统一代码当中。所以,统一代码增加了代理块( surrogate block)。
代理块是统一代码用来扩展超出现有1 6位数字的字符空间的办法。它保留了两个1 024个字
符的区域( D 8 0 0到D B F F和D C 0 0到D F F F)以容纳1 048 576个附加字符。第一个区域内的1 6位值
是一个3 2位数字的高端部分,而第二个则是低端部分。这就允许并不理解这些组合字符的程序
能够简单地显示一个或两个占位符。这些扩充字符能够用于现代象形文字语言(例如汉语和日
语),古语(例如埃及的象形文字),甚至新发明的语言( K l i n g o n、To l k i e n的D w a r v i s h码)。
但无论是好是坏,代理块字符对并不是合法的X M L字符。
(3) 字节顺序掩码(Byte-Order Mark、B O M)
统一代码数据利用B O M作为信号来指定所使用的编码方法(参见表2 - 4)。
表2 - 4
字节编码形式
00 00 FE FF U T F - 3 2 / U C S - 4,大尾数法
FF FE 00 00 U T F - 3 2 / U C S - 4,小尾数法
FE FF 00 ## U T F - 1 6,大尾数法
FF FE ## 00 U T F - 1 6,小尾数法
EF BB BF U T F - 8
虽然这些值在X M L数据中并不是合法的,但它们能够把有效的X M L数据加入到被传输的数
据对象当中,并为X M L解析器和/或应用程序提供有价值(虽然通常是冗余的)的编码信息。
X M L解析器必需在X M L数据之前处理B O M,因为需要同时支持U T F - 8和U T F - 1 6编码。
下面,让我们看一看序言的第二种可选的组件。
2. 文档类型声明
我们不能把它同文档类型定义(也就是通常所说的D T D)相混淆的。而且,文档类型声明
40使用XML 高级编程
下载
中包含着文档类型定义的内部子集和/或到外部子集的引用。
所有有效的X M L文档必需包含这个声明,但简单的格式正规的文档并不需要这样的包含关
系,而且它们也不包含(除了5个标准X M L实体)任何实体引用。如果使用了附加的字符实体,
 
中国航空网 www.aero.cn
民航翻译 www.aviation.cn
本文链接地址:XML高级编程上(17)
 
------分隔线----------------------------