1、前言
在开发JavaWeb的过程当中,不免会出现中文乱码的问题。接下来写的是我在解决中文乱码问题时的学习心得,一是为了能加深印象,二是但愿能帮初学者们解决一些疑惑。若有说的不对的地方,但愿及时指出批评。java
2、正文
之因此会出现中文乱码,是由于在进行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时,不要在文件中写入中文字符eclipse
2.将Java文件编译成class文件学习
不管在编写java文件时使用的是何种编码方式,在编译成class文件后,都是同样的Unicode编码(准确说是UTF-16编码)。编码
3.JVM加载class文件spa
JVM加载class文件使用的是Unicode编码方式。就是说以前在编写Java文件时,若是在文件中出现了操作系统
String s="中文字符";
定义的字符串在内存中都是以Unicode编码的形式存在。
这里只是说从class文件中加载进来的字符串,不是说全部的的内存中的字符串code
内存中的字符串不只有从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");