中文乱码问题详解 java 中文乱码问题详解
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 是在 GB2312 基础上扩充来的。 采用 GBK 编码 由于 Java 语言内部采用 UNICODE 编码,所以在 JAVA 程序运行时,就存在着一个从 UNICODE 编 编码, 程序运行时, 码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转换过程有着一系列的步骤, 码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转换过程有着一系列的步骤, 操作系统及浏览器支持的编码格式转换输入 如果其中任何一步出错,则显示出来的汉字就会出是乱码, 中文
问题。 如果其中任何一步出错,则显示出来的汉字就会出是乱码,这就是我们常见的 JAVA 中文问题 同时,
Java 是一个跨平台的编程语言,也即我们编写的程序不仅能在中文 windows 上运行,也能在中文 Linux 等系统上运行,同时也要求能在英文等系统上运行(我们经常看到有人把在中文 win2k 上编写的 JAVA 程序,移植到英文 Linux 上运行)。这种移植操作也会带来中文问题。 还有,有人使用英文的操作系统和英文的 IE 等浏览器,来运行带中文字符的程序和浏览中文网页,它 们本身就不支持中文,也会带来中文
问题。 编码格式来传递,而不是按中文编码传递,所以, 几乎所有的浏览器默认在传递参数时都是以 UTF-8 编码格式来传递,而不是按中文编码传递,所以, 传递中文参数时也会有问题,从而带来乱码现象。 传递中文参数时也会有问题,从而带来乱码现象。
总之, 以上几个方面是 JAVA 中的中文问题的主要来源, 我们把以上原因造成的程序不能正确运行而产 生的问题称作:JAVA 中文问题。
2. JAVA 编码转换的详细过程
我们常见的 JAVA 程序包括以下类别: *直接在 console 上运行的类(包括可视化界面的类) *JSP 代码类(注: