JavaWeb中文乱码初探

370 查看

一、前言
  在开发JavaWeb的过程中,难免会出现中文乱码的问题。接下来写的是我在解决中文乱码问题时的学习心得,一是为了能加深印象,二是希望能帮初学者们解决一些疑惑。如有说的不对的地方,希望及时指出批评。

二、正文
之所以会出现中文乱码,是因为在进行I/O时的编码方式不正确。而I/O主要有磁盘I/O和网络I/O。下边我们就从编写一个Java文件开始进行分析。

1.编写文件

比如当创建一个文本文件,内空写上“My name is 王某某”,然后直接Ctrl+S保存。再双击打开这个文件时理所当然的能看到正确内容。但是当使用Sublime来打开这个文件时(使用UTF-8编码打开),却出现这种情况:

原因是在使用Ctrl+S直接保存文件的时候,采用的是ANSI编码(打开刚刚的文本文件,另存为,可以看到使用的是哪种编码方式

什么是ANSI编码方式呢?在简体中文Windows操作系统中,ANSI代表的是GBK编码。也就是说刚刚编写的文件,在保存的时候使用了GBK编码,打开时用的是UTF-8编码,当然会出现乱码了。
所以为了解决从网上下载的代码打开时有乱码这种情况,只要设置打开文件的编码方式和该文件本身的编码方式一致就可以了。当设置文件的编码方式为ISO-8859-1时,不要在文件中写入中文字符

2.将Java文件编译成class文件

无论在编写java文件时使用的是何种编码方式,在编译成class文件后,都是一样的Unicode编码(准确说是UTF-16编码)。

3.JVM加载class文件

JVM加载class文件使用的是Unicode编码方式。就是说之前在编写Java文件时,如果在文件中出现了

String s="中文字符";

定义的字符串在内存中都是以Unicode编码的形式存在。
这里只是说从class文件中加载进来的字符串,不是说所有的的内存中的字符串

内存中的字符串不仅有从class文件中加载进来的,还有从磁盘文件中读取的、从数据库中读取的、从请求中读取的等等。要保证不出现乱码问题,当然是要确定字符串来源的编码方式,然后再以对应的编码方式来转换。

4.在控制台打印乱码

创建2个Java文件,一个是ANSI编码,一个是Utf-8编码,2个Java文件的main方法里都写入以下代码:

String s="i我";
System.out.println(s);

然后使用cmd进行编译(在编译utf-8编码的文件时要在命令后加-encoding utf-8),然后运行,都正常。


然后!我就在eclipse里进行开发了!我将项目的文件编码设置成utf-8:

但是!结果却打印了乱码!

而且连Servlet中响应的内容也乱码了!弄到这里的时候我找了挺多文章都没有能解决的。然后请教了一位前辈,让我这样来设置Eclipse的编码方式:Window--Preferences--Workspace

然后就解决了eclipse中打印和输入乱码问题了。之前Eclipse出现乱码的原因我也没想明白,难道是编译时没有使用UTF-8编码吗?希望知道的前辈能够指点一下,感激不尽。

5.输出

Servlet中设置请求和响应对象的编码方式就可以了,这个没啥好说的了。

req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");