1、中文问题的来源
计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一
切处理程序最初都是以单字节编码的英文为准进行处理。随着计算机的发展,
为 了 适 应 世 界 其 它 民 族 的 语 言 ( 当 然 包 括 我 们 的 汉 字 ) , 人 们 提 出 了
UNICODE 编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符
编码,所以,目前,大多数国际性的软件内部均采用 UNICODE 编码,在软件
运行时,它获得本地支持系统(多数时间是操作系统)默认支持的编码格式,
然后再将软件内部的 UNICODE 转化为本地系统默认支持的格式显示出来 。
Java 的 JDK 和 JVM 即是如此,我这里说的 JDK 是指国际版的 JDK,我们大多
数程序员使用的是国际化的 JDK 版本,以下所有的 JDK 均指国际化的 JDK 版
本。我们的汉字是双字节编码语言,为了能让计算机处理中文,我们自己制定
的 gb2312、GBK、GBK2K 等标准以适应计算机处理的需求。所以,大部分的
操作系统为了适应我们处理中文的需求,均定制有中文操作系统,它们采用的
是 GBK,GB2312 编码格式以正确显示我们的汉字。如:中文 Win2K 默认采用的
是 GBK 编码显示,在中文 WIN2k 中保存文件时默认采用的保存文件的编码格
式也是 GBK 的,即,所有在中文 WIN2K 中保存的文件它的内部编码默认均采
用 GBK 编码,注意:GBK 是在 GB2312 基础上扩充来的。由于 Java 语言内部
采用 UNICODE 编码,所以在 JAVA 程序运行时,就存在着一个从 UNICODE 编
码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转
换过程有着一系列的步骤,如果其中任何一步出错,则显示出来的汉字就会出
是乱码,这就是我们常见的 JAVA 中文问题。同时,Java 是一个跨平台的编程
语言,也即我们编写的程序不仅能在中文 windows 上运行,也能在中文 Linux
等系统上运行,同时也要求能在英文等系统上运行(我们经常看到有人把在中
文 win2k 上编写的 JAVA 程序,移植到英文 Linux 上运行)。这种移植操作也会
带来中文问题。还有,有人使用英文的操作系统和英文的 IE 等浏览器,来运行
带中文字符的程序和浏览中文网页,它们本身就不支持中文,也会带来中文问
题。几乎所有的浏览器默认在传递参数时都是以 UTF-8 编码格式来传递,而不
是按中文编码传递,所以,传递中文参数时也会有问题,从而带来乱码现象。
总之,以上几个方面是 JAVA 中的中文问题的主要来源,我们把以上原因造成
的程序不能正确运行而产生的问题称作:JAVA 中文问题。
2、JAVA 编码转换的详细过程
我们常见的 JAVA 程序包括以下类别:
*直接在 console 上运行的类(包括可视化界面的类)
*JSP 代码类(注:JSP 是 Servlets 类的变型)
*Servelets 类
*EJB 类
*其它不可以直接运行的支持类这些类文件中,都有可能含有中文字符串,
并且我们常用前三类 JAVA 程序和用户直接交互,用于输出和输入字符,如:
我们在 JSP 和 Servlet 中得到客户端送来的字符,这些字符也包括中文字符。无