由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问题解决办法之后,结合作者的编程实践,我发现过去谈的许多办法都不能明晰地阐明问题及解决问题,尤其是跨平台时的中文问题。
于是我给出此篇文章,内容包括对控制台运转的class、Servelets、JSP及EJB类中的中文问题我剖析和建议解决办法。希望大家指教。
Abstract:本文深入剖析了Java顺序设计中Java编译器对Java源文件和JVM对class类文件的编码/解码过程,经过此过程的解析透视出了Java编程中中文问题发生的基本缘由,最后给出了建议的最优化的解决Java中文问题的办法。
1、中文问题的来源
计算机最后的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处置顺序最后都是以单字节编码的英文为准停止处置。
随着计算机的发展,为了适应世界其它民族的言语(当然包括我们的汉字),人们提出了UNICODE编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目前,大少数国际性的软件内部均采用UNICODE编码,在软件运转时,它取得本地支持系统(少数工夫是操作系统)默认支持的编码格式,然后再将软件内部的UNICODE转化为本地系统默认支持的格式显示出来。
Java的JDK和JVM即是如此,我这里说的JDK是指国际版的JDK,我们大少数顺序员使用的是国际化的JDK版本,以下所有的JDK均指国际化的JDK版本。我们的汉字是双字节编码言语,为了能让计算机处置中文,我们本人制定的gb2312、GBK、GBK2K等规范以适应计算机处置的需求。
1
所以,大部分的操作系统为了适应我们处置中文的需求,均定制有中文操作系统,它们采用的是GBK,GB2312编码格式以正确显示我们的汉字。如:中文Windows默认采用的是GBK编码显示,在中文Windows2000中保管文件时默认采用的保管文件的编码格式也是GBK的,即所有在中文Windows2000中保管的文件它的内部编码默认均采用GBK编码,注意:GBK是在GB2312基础上扩充来的。
由于Java言语内部采用UNICODE编码,所以在Java顺序运转时,就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换输入、输入的问题,这个转换过程有着一系列的步骤,如果其中任何一步出错,则显示出来的汉字就会出是乱码,这就是我们常见的Java中文问题。
同时,Java是一个跨平台的编程言语,也即我们编写的顺序不仅能在中文windows上运转,也能在中文Linux等系统上运转,同时也要求能在英文等系统上运转(我们常常看到有人把在中文Windows2000上编写的Java顺序,移植到英文Linux上运转)。这种移植操作也会带来中文问题。
还有,有人使用英文的操作系统和英文的IE等浏览器,来运转带中文字符的顺序和浏览中文网页,它们自身就不支持中文,也会带来中文问题。
简直所有的浏览器默认在传递参数时都是以UTF-8编码格式来传递,而不是按中文编码传递,所以,传递中文参数时也会有问题,从而带来乱码景象。
总之,以上几个方面是Java中的中文问题的主要来源,我们把以上缘由造成的顺序不能正确运转而发生的问题称作:Java中文问题。
2、Java编码转换的详细过程
我们常见的Java顺序包括以下类别:
*直接在console上运转的类(包括可视化界面的类)
*JSP代码类(注:JSP是Servlets类的变型)
*Servelets类
*EJB类
*其它不可以直接运转的支持类