Java 中文问题及最优解决方法
本篇文章来源于: 开发 edu.codepub 原文链接:edu.codepub/2010/0415/22058.php
由于 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 等标准以适应计算机处理的需求。所以,大部分的操作系统为了适应我们处理中文的需求,均定 制有中文操作系统,它们采用的是 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 类的 作