[IT 技术 解决中文乱码问题 技术]解决中文乱码问题
Tags:
web java gbk uriencoding 中文 tomcat jsp
一、中文问题的来源 计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单 字节编码的英文为准进行处理。 随着
计算机的发展, 为了适应世界其它民族的语言 (当然包括我们的汉字) , 人们提出了 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 中得到客户端送来的字符,这些字符也包括中文字符。无论这些 JAVA 类的作用如何,这些 JAVA 程序的生命周期都是这样的: *编程人员在一定的操作系统上选择一个合适的编辑软件来实现源程序代码并以.java 扩展名保存在操 作系统中,例如我们在中文 win2k 中用记事本编辑一个 java 源程序; *编程人员用 JDK 中的 javac.exe 来编译这些
源代码,形成.class 类(JSP 文件是由容器调用 JDK 来 编译的); *直接运行这些类或将这些类布署到 WEB 容器中去运行,并输出结果。
那么,在这些过程中,JDK 和 JVM 是如何将这些文件如何编码和解码并运行的呢? 这里,我们以中文 win2k 操作系统为例说明 JAVA 类是如何来编码和被解码的。 第一步,我们在中文 win2k 中用编辑软件如记事本编