java基础——servlet乱码问题

servlet 乱码问题

1. 乱码的本质

乱码的本质就是文件或者流存的编码与读的编码不一样,就会导致乱码。

2.常用的编码

  • gb2312gbkgb1830(系统默认编码,中国的国标码)

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两种情况,当然有时还要考虑数据库乱码问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容