JAVA 的中文字符乱码问题
2012-08-05 16:42:08|分类: 默认分类 |标签:java |举报 |字号大中小订阅
JAVA 的中文字符乱码问题一直很让人头疼。特别是在 WEB 应用中。网上
的分析文章和解决方案都很多,但总是针对某些特定情况的。很多次遇到乱码
问题后,经过极为辛苦的调试和搜索资料后终于解决,满以为自己已经掌握了
对付这些字符乱码怪兽的诀窍。可当过段时间,换了个应用或换了个环境,又
会碰到那讨厌的火星文,并再次无所适从。于是下决心好好整理一下中文字符
编码问题,以方便自己记忆,也为其他程序员兄弟们提供一份参考。
首先要了解 JAVA 处理字符的原理。JAVA 使用 UNICODE 来存储字符数据,
处理字符时通常有三个步骤:
-按指定的字符编码形式,从源输入流中读取字符数据
-以 UNICODE 编码形式将字符数据存储在内存中
-按指定的字符编码形式,将字符数据编码并写入目的输出流中。
所以 JAVA 处理字符时总是经过了两次编码转换,一次是从指定编码转换
为 UNICODE 编码,一次是从 UNICODE 编码转换为指定编码。如果在读入时
用错误的形式解码字符,则内存存储的是错误的 UNICODE 字符。而从最初文
件中读出的字符数据,到最终在屏幕终端显示这些字符,期间经过了应用程序
的多次转换。如果中间某次字符处理,用错误的编码方式解码了从输入流读取
的字符数据,或用错误的编码方式将字符写入输出流,则下一个字符数据的接
收者就会编解码出错,从而导致最终显示乱码。
这一点,是我们分析字符编码问题以及解决问题的指导思想。
好,现在我们开始一只只的解决这些乱码怪兽。
一、在 JAVA 文件中硬编码中文字符,在 eclipse 中运行,控制台输出了乱
码。
例如,我们在 JAVA 文件中写入以下代码:
Stringtext="大家好";
System.out.println(text);
如果我们是在 eclipse 里编译运行,可能看到的结果是类似这样的乱
码:????。那么,这是为什么呢?
我们先来看看整个字符的转换过程。
1.在 eclipse 窗口中输入中文字符,并保存成 UTF-8 的 JAVA 文件。这里发
生了多次字符编码转换。不过因为我们相信 eclipse 的正确性,所以我们不用分
析其中的过程,只需要相信保存下的 JAVA 文件确实是 UTF-8 格式。