servlet 乱码问题
1. 乱码的本质
乱码的本质就是文件或者流存的编码与读的编码不一样,就会导致乱码。
2.常用的编码
-
gb2312
、gbk
、gb1830
(系统默认编码,中国的国标码)
GB2312兼容ASCII码,这部分还是每个字符占1个字节。每个汉字字符占2个字节。GB2312兼容ASCII码,这部分还是每个字符占1个字节。每个汉字字符占2个字节
- Unicode(万国码,统一码):
它为每种语言中的每个字符设定了统一并且唯一的编码,以满足跨语言、跨平台进行文本转换、处理的要求。
- utf-8(支持全世界的编码):
UTF-8对不同范围的字符使用不同长度的编码,ASCII编码部分与ASCII一样,都是1个字节。而汉字部分都是3个字节。
- iso-8859-1(不支持中文):
tomcat的默认编码
3.response响应乱码
3.1: 添加 response.setCharacterEncoding("utf-8");
添加上面语句,发现客户端浏览器仍然乱码。
原因:浏览器以默认的编码解析服务器编码的数据。
结论:response.setCharacterEncoding("utf-8");只是告诉tomcat用什么编码响应数据。
3.2: 添加 response.setHeader("content-type", "text/html;charset=UTF-8");
添加上面语句,发现客户端浏览器成功解决乱码。
原因:浏览器以与服务器相同的编码方式解析。
结论:response.setHeader("content-type", "text/html;charset=UTF-8");告诉浏览器用什么编码方式解析数据。
综上给出解决response乱码方案:
response.setHeader("content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");
另一种方案:
//告知服务器用什么码表编码,同时告知浏览器用什么码表解码。
response.setContentType("text/html;charset=utf-8");
4.request请求乱码
- post乱码
浏览器发送post请求时,浏览器使用的什么编码提交那么post就是什么编码。
由于客户端没有告诉服务器,请求正文的编码,于是服务器默认用ISO-8859-1进行编码
4.1 添加 request.setCharacterEncoding("utf-8");
成功解决乱码
原因:诉服务器请求正文的数据应该使用的编码是什么
- get乱码
浏览器发送get请求时,浏览器使用的什么编码提交那么get就是什么编码。
但是当请求到达服务器后,get请求后面的参数默认使用iso-8859-1进行编码。导致乱码。
4.1 添加 request.setCharacterEncoding("utf-8");
上面代码执行后无效,没能成功解决乱码。
原因:此种解决方法只对post有效。
4.2
//拿到原始的二进制数据,用UTF-8进行重新编码
String name = reuqest.getParameter("name");
byte b[] = name.getBytes("ISO-8859-1");//1010101
String name = new String(b,"UTF-8");//解决
5.另一种解决乱码的方法
在
tomcat
安装目录conf/server.xml
下有如下的配置:
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
我们可以在里面添加一个与编码有关的参数信息:URIEncoding,该配置决定了使用get请求通过浏览器地址访问栏的编码方式,默认的是iso-8859-1。
在官方文档中国有说明的:https://tomcat.apache.org/tomcat-7.0-doc/config/http.html
于是我们可以这么配置:
<Connector URIEncoding="utf-8" port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
6.总结
servlet中的乱码是由于
tomcat默认的编码是iso-8859-1 不支持中文
,使用中文时就会出现问题。解决乱码也要分情况讨论,响应或者请求,后者又分为get与post两种情况,当然有时还要考虑数据库乱码问题。