Java 中文乱码问题详解 Java 中文乱码问题是一个老生常谈的问题,特别是在 Web 应用中。今天,我们将从编码角度分析 Java 编译后在控制台和 Web 等终端显示乱码问题。 一、 Java 处理字符的原理 Java 使用 UNICODE 来存储字符数据,处理字符时通常有三个步骤:按指定的字符编码形式,从源输入流中读取字符数据;以 UNICODE 编码形式将字符数据存储在内存中;按指定的字符编码形式,将字符数据编码并写入目的输出流中。所以 Java 处理字符时总是经过了两次编码转换,一次是从指定编码转换为 UNICODE 编码,一次是从 UNICODE 编码转换为指定编码。 二、乱码问题的原因 如果在读入时用错误的形式解码字符,则内存存储的是错误的 UNICODE 字符。而从最初文件中读出的字符数据,到最终在屏幕终端显示这些字符,期间经过了应用程序的多次转换。如果中间某次字符处理,用错误的编码方式解码了从输入流读取的字符数据,或用错误的编码方式将字符写入输出流,则下一个字符数据的接收者就会编解码出错,从而导致最终显示乱码。 三、在 Eclipse 中运行 Java 文件乱码问题 我们在 Eclipse 中编译运行 Java 文件,可能看到的结果是类似这样的乱码:????。那么,这是为什么呢?我们先来看看整个字符的转换过程。 1. 在 Eclipse 窗口中输入中文字符,并保存成 UTF-8 的 Java 文件。这里发生了多次字符编码转换。不过因为我们相信 Eclipse 的正确性,所以我们不用分析其中的过程,只需要相信保存下的 Java 文件确实是 UTF-8 格式。 2. 在 Eclipse 中编译运行此 Java 文件。这里有必要详细分析一下编译和运行时的字符编码转换。 - 编译:我们用 javac 编译 Java 文件时,javac 不会智能到猜出你所要编译的文件是什么编码类型的,所以它需要指定读取文件所用的编码类型。默认 javac 使用平台缺省的字符编码类型来解析 Java 文件。平台缺省编码是操作系统决定的,我们使用的是中文操作系统,语言区域设置通常都是中国大陆,所以平台缺省编码类型通常是 GBK。这个编码类型我们可以在 Java 中使用 System.getProperty("file.encoding") 来查看。所以 javac 会默认使用 GBK 来解析 Java 文件。如果我们要改变 javac 所用的编码类型,就要加上-encoding 参数,如 javac -encoding utf-8 Test.java。 - 运行:编译后字符数据会以 UNICODE 格式存入字节码文件中。然后 Eclipse 会调用 java 命令来运行此字节码文件。因为字节码中的字符总是 UNICODE 格式,所以 java 读取字节码文件并没有编码转换过程。虚拟机读取文件后,字符数据便以 UNICODE 格式存储在内存中了。 3. 调用 System.out.println 来输出字符。这里又发生了字符编码转换。System.out.println 使用了 PrintStream 类来输出字符数据至控制台。PrintStream 会使用平台缺省的编码方式来输出字符。我们的中文系统上缺省方式为 GBK,所以内存中的 UNICODE 字符被转码成了 GBK 格式,并送到了操作系统的输出服务中。如果到这一步,我们的字符其实不再是GBK 编码的话,终端就会显示出乱码。 四、解决乱码问题的方法 要解决乱码问题,我们需要了解 Java 处理字符的原理,并了解编译和运行时的字符编码转换过程。在编译时,需要指定正确的编码类型;在运行时,需要正确地处理字符编码转换,以避免乱码的出现。
剩余6页未读,继续阅读
- 粉丝: 2
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助