文章目录
中文乱码问题
一、请求乱码(服务器获取请求参数时乱码)
post方法请求:
1.原因:
服务器获取请求体内容时默认用iso编码方式进行解码。但是浏览器请求体中编码方式是html中指定的utf-8,所以就乱码了。
2.详细解释:
参数在html页面中请求,会按 照页面中的编码格式编码, 不指定请求体编码,默认按ISO8859-1编码。html中的<meta http-equiv="content-type" content="text/html; charset=UTF-8">
,指定了浏览器对html的编码格式,post请求参数也会按页面的编码格式进行编码,请求参数在请求体中请求向服务器请求。
服务器获取post请求数据时(request.getParameter(“name”)),在不指定对请求体编码方式的情况下,不论浏览器传来的数据是什么编码,服务器都按iso8859-1对请求体解码,只要 请求体编码 跟 服务器对请求体的解码 方式不一样,就肯定会乱码。
3.解决服务器获取请求体中文乱码方式:
- 1.在获取请求数据前设置对请求数据的编码格式,
即告诉服务器应该用什么编码对请求参数进行解码。
request.setCharacterEncoding("utf-8")
, 这句话就是告诉服务器应该按utf-8格式对参数解码。
如果浏览器是按照gbk方式进行编码的,那么这么设置还是会乱码。 - 2.在获取请求参数后,对每个参数进行重新编码
String n2 = new String(获取到的参数.getBytes("iso8859-1"),"utf-8");
代码解释:获取到的参数默认按照iso进行解码(获取到的参数已经被服务器按iso解码了),所以我们要先对他按iso编码,即getBytes("iso8859-1")
得到初始的参数,然后在根据utf-8
重新解码。如果浏览器是按照gbk方式编码,那就再根据gbk进行解码。即:new String(获取到的参数.getBytes("iso8859-1"),"gbk");
get方法请求:
1.原因:
请求数据在请求行数,编码方式也是按页面指定的编码utf-8,服务器对请求行中的参数只能用默认uri编码(iso或utf-8)进行解码,如果服务器默认uri编码是iso8859-1将会产生乱码。
2.详细解释:
请求数据在请求行中 按照页面编码格式编码(不指定页面编码默认是iso8859-1)。
服务器获取get方式的请求行中的参数时,只能用默认编码方式(8之前iso,8之后utf-8)解码。tomcat8之后默认URIEncoding是utf-8,tomcat8.5 如果页面是utf-8的话,get方式请求就不会乱码。
阶段性理解:tomcat中的URIEncoding应该是指请求行中的编码格式
3.解决get方式服务器获取请求参数中文乱码方式:
(tomcat8的服务器对请求体解码是utf-8,如果乱码了就表示浏览器中不是utf-8编码的)
- 1.对获取到的参数重新编码 new String(参数.getBytes("解码格式 "),“编码格式”),与post一样
- 2.修改服务器默认uri编码。server.xml中添加uriEncoding。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
System.out.println(name);//正常
String n1 = new String(name.getBytes("iso8859-1"),"utf-8");
System.out.println(n1);// 乱码
// 结论:按照utf-8编码解析url中的参数
}
get不乱码的原因: https://blog.csdn.net/qq_32965187/article/details/87889052
获取tomcat的默认 uri编码:https://blog.csdn.net/love20yh/article/details/80863997
二、响应乱码(浏览器获取响应体时中文乱码)
1.原因:
服务器对响应体的编码格式,与,浏览器对服务器响应体的解码格式不一样。或使用的编码格式不支持中文。
2.详细解释:
服务器响应数据时(输出流write到响应体),在不指定编码方式的情况下,默认也是用ISO8859-1的方式,对响应内容进行编码
那么,首先iso是不支持中文的,肯定会产生乱码;
其次,即使服务器对响应体的编码方式支持中文,浏览器可能解码方式与其不匹配。
(在浏览器控制台中的响应体里是通过服务器编码过的,在浏览器页面显示的是浏览器对响应体中的内容 解码 解析 过的)
3.解决浏览器获取响应数据中文乱码:
-
1.设置服务器对响应数据的编码格式,如utf-8,gbk。
response.setCharacterEncoding("utf-8")
:解释,将响应体内容按照指定编码格式进行编码。在浏览器控制台中的响应体中可以看到。
但是,尽管响应数据支持中文了,浏览器的解码方式可能跟我们的编码方式不一样,浏览器同样会乱码。浏览器对响应体默认解码 是 gbk 或 utf-8,祖国的电脑一般都是gbk编码的,所以浏览器一般也都是gbk的。 -
2.指定响应头中的contentType(推荐),内容类型。如:
response.setContentType("text/html;charset=utf-8");
设置服务器对响应体编码格式为utf-8,告诉浏览器用utf-8编码对响应体解码。
这句话的作用:
①、设置了响应编码格式,即调用了response.setCharacterEncoding("utf-8");
②、把响应头的contentType字段改成了"text/html;charset=utf-8"
contentType="text/html;charset=utf-8"
:就相当于 html中的meta标签的内容类型
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
即,告诉浏览器用utf-8编码格式 解码当前页面(响应体)中的数据。
普通html页面请求时,是将html源码响应到响应体中,然后浏览器进行解码解析,如果配置了charset,将会按指定编码格式进行解码。
三、URL编码
URL编码不同情况的解析: https://www.cnblogs.com/xiaojiulin/p/10598658.html
URL编码,不同情况有不同的url编码方式。post和get的所有请求数据都会按照页面编码方式把中文转成url编码。其中 %XX 是一个字符,utf-8三个字符表示一个汉字,GBK两个字符表示一个汉字。
get和post请求,都会将查询字符串(参数)中非数字字母的字符按照网页编码格式进行URL编码。
URL编码
例如:“传智”这两个字通过URL编码后得到的是:“%E4%BC%A0%E6%99%BA”。URL编码是先需要把“传智”转换成字节,例如我们现在使用UTF-8把“传智”转换成字符,得到的结果是:“[-28, -68, -96, -26, -103, -70]”,然后再把所有负数加上256,得到[228, 188, 160, 230, 153, 186],再把每个int值转换成16进制,得到[E4, BC, A0, E6, 99, BA],最后再每个16进制的整数前面加上“%”。
通过URL编码,把“传智”转换成了“%E4%BC%A0%E6%99%BA”,然后发送给服务器!服务器会自动识别出数据是使用URL编码过的,然后会自动把数据转换回来。
中文乱码问题,比较清楚明了: https://blog.csdn.net/xiaoyiaoyou/article/details/45147495
跟上边的一样:https://www.cnblogs.com/xdouby/p/8308915.html
POST和GET请求
一、POST和GET请求方式的区别:
- Get:
GET提交的数据会放在URL之后,也就是请求行里面,以?
分隔URL和传输数据,参数之间以&
相连 - POST:
当HTTP请求以POST方式发出时,请求参数位于请求体中。
区别:
get方法参数在url中,浏览器对URL的长度有限制,所以get的请求数据大小有限,因为url暴露在外边,所以安全性不高。
post方法请求参数在请求体中,所以请求数据大小没有限制,请求体不能直接看到,所以安全性相对高。
注意:在默认情况下,浏览器发送的HTTP请求(GET和POST都是)采用“ISO-8859-1”字符编码;
但一般都会按页面编码方式编码
二、tomcat对post和get采用不同的处理编码机制:
网上资料显示:自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码,
对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认的iso-8859-1编码
(注意:Tomcat对请求体,响应体中的编码都是iso8859-1)。
GET请求则不同,Tomcat对GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,而会使用Tomcat默认的UriEncding:iso-8859-1编码,但是在tomcat8之后URLEncoding默认是utf-8。即!对请求行中的数据按utf-8编码进行解码
======================================================
总结:
在不指定编码的情况下,服务器都是按照iso8859-1编码格式对请求体进行编码(服务器对请求行解码,tomcat8之后用utf-8,8之前也是iso8859-1),对响应体解码,浏览器解码是按照自己的编码(一般是utf-8和gbk),请求体的编码也是默认iso8859-1。
解决请求参数中文乱码:
- 1.
request.setCharacterEncoding("编码格式");
一般是utf-8,或gbk - 2.获取到参数后,重新编码
String n2 = new String(请求参数.getBytes("iso8859-1"),"编码格式");
一般是utf-8,或gbk
解决响应数据中文乱码:
- 1.
response.setCharacterEncoding("编码格式");
- 2.
response.setContentType("text/html;charset=编码格式");
(推荐)