原理与实践( 4 )
本篇我们来讨论一下 struts 的国际化编程问题,即所谓的 i18n 编程问题,这
一篇我们讨论其基础部分。与这个问题紧密相关的是在各 java 论坛中被频繁提
及的中文乱码问题,因为,英、美编程人员较少涉及到中文乱码问题,因此,
这方面的英文资料也是非常奇缺的,同时也很少找到这方面比较完整的中文资
料,本文也尝试对中文乱码问题做一些探讨。要解决上述问题,需要有一定的
字符集方面的知识,下面,我们就先介绍字符集的有关情况:
一、从 ASCII 到 Unicode(UTF-8)
电子计算机技术是从美国开始发展起来的,因为美国使用的文字为英文,美国
规定的计算机信息交换用的字符编码集是人们熟知的扩展 ASCII 码,它以 8bit
字节为单位存储,ASCII 的 0-31 及 127 为控制符,32-126 为可见字符,包括
所有的英文字母,阿拉伯数字和其他一些常见符号,128-255 的 ASCII 码则没
有定义。
ASCII 对英语国家是够用了,但对其他西欧国家却不够用,因此,人们将
ASCII 扩展到 0-255 的范围,形成了 ISO-8859-1 字符集。值得一提的是,因
为考虑到程序中处理的信息大多是西文信息,因此有些 WEB 容器(如:
Tomcat4.x)在处理所接收到的 request 字符串时,如果您没指定 request
的编码方式则系统就缺省地采用 ISO-8859-1,明白这一点对理解后面的问题
会有帮助。
相比西方的拼音文字,东方的文字(如中文)的字符数要大得多,根本不可能
在一个字节内将它们表示出来,因此,它们以两个字节为单位存储,以中文国
标字符集 GB2312 为例,它的第一个字节为 128-255。系统可以据此判断,
若第一个字节大于 127,则把与该字节后紧接着的一个字节结合起来共两个字
节组成一个中文字符。这种由多个字节存储一个字符的字符集叫多字节字符集
(MultiByte Charsets),对应的象 ASCII 这种用一个字节存储一个字符的字
符集叫单字节字符集(SingleByte Charsets)。在 GB2312 字符集中,
ASCII 字符仍然用一个字节存储,换句话说该 ASCII 是该字符集的子集。
GB2312 只包含数千个常用汉字,往往不能满足实际需要,因此,人们对它进
行扩展,这就有了我们现在广泛使用的 GBK 字符集,GBK 是现阶段 Windows
及其他一些中文操作系统的缺省字符集。它包含 2 万多个字符,除了保持和
GB2312 兼容外,还包含繁体中文字,日文字符和朝鲜字符。值得注意的是
GBK 只是一个规范而不是国家标准,新的国家标准是 GB18030-2000,它是
比 GBK 包含字符更多的字符集。
我国的台湾地区使用的文字是繁体字,其字符集是 BIG5,而日本采用的字符集
则是 SJIS。它们的编码方法与 GB2312 类似,它们的 ASCII 字符部分是兼容的,
但扩展部分的编码则是不兼容的,比如这几种字符集中都有"中文"这两个字符,