首先明确为什么会出现乱码:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90kaNl3ZE10MnR1T6VEVjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DN1ADMxkjMxIzNyMDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
1.客户端发送请求,浏览器将数据进行打包(默认utf-8),然后发送至服务器
2.服务器对接收的数据进行解码(默认为iso-8859-1),然后将数据进行处理,最后打包传回浏览器
3.浏览器将传回的数据包进行解码显示,完成一次连接交互。
在这一过程中应该确保所有步骤的编码或解码方式保持一致,否则就会出现乱码问题。
一、表单的中文问题
浏览器对表单中的数据(非ascii字符)会进行编码。所使用的编码是打开该表单所在的页面时所使用的编码。
1、 静态页面(html)编码问题
使用
<meta http-equiv="content-type" content="text/html;charset=utf-8">
指定打开页面时的编码。
2、 Jsp页面编码问题
在JSP页面上输入中文,请求页面后不出现乱码。应该保证:
contentType="text/heml;charset=UTF-8"pageEncoding="UTF-8" charset和pageEncoding
的编码一致,且都支持中文,通常建议取值UTF-8
还需要保证浏览器的显示的字符编码也和请求的JSP页面的编码一致
3、servlet中编码问题
获取中文参数值:默认参数在传输过程中使用的编码为ISO-8859-1
①对于POST请求:在获取请求信息之前(调用request.getParameter() 或者是 request.getRead())使用request.setCharacterEncoding(“utf-8”)即可
②对于GET请求:前面的方式对于GET无效,可以通过修改Tomcat的server.xml文件的方式,修改方式下文提到
//指定request对象解码时所使用的编码格式。
a. request.setCharacterEncoding("utf-8");
b.如果要输出数据到浏览器,还要使用
response.setContentType("text/html;charset=utf-8");
4、 如果要保存数据到数据库
a. 创建数据库时,使用:
create database cc default
character set utf8;
b. jdbc驱动程序,指定数据库编码,即告诉驱动程序,当前数据库保存数据所使用的
编码是什么。
jdbc:mysql://localhost:3306/cc?
useUnicode=true&characterEncoding=utf8
二、链接地址包含中文 (GET方式)
浏览器会对链接地址中的中文(包含其它ascii字符以外的字符,比如日文,部分的拉丁字符)进行编码,默认采用采用utf-8编码。
服务器端默认情况下采用iso-8859-1解码。此时,可以通过设置配置文件的方式,告诉服务器采用指定的编码来解码。
tomcat_home/conf/server.xml 添加 URIEncoding=”utf-8”,作用是:服务器
对于get请求,采用“utf-8”来解码。
三、请求参数当中包含中文
请求参数当中包含中文,浏览器也会编码,所使用编码与打开该页面时的编码一致。
方案一:
保证页面打开时的编码与URIEncoding的设置一致。
方案二:
如果页面打开时的编码与URIEncoding的设置不一致,可以
<a href="xxx?name=<%=URLEncoder.encode("中文","编码")%>"></a>