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