大家好,又见面了,我是你们的朋友全栈君。
当页面中提交包含中文的请求时,在服务端有可能出现中文乱码问题。
一、乱码产生原因
Http协议中规定,数据传输采用字节编码方式,因为通信的数据不仅仅是字符。当用户通过浏览器提交一个包含 UTF-8 编码格式的两个字的中文请求时,浏览器会将这两个中文字符变为六个字节(一般一个 UTF-8 汉字占用三个字节),并将这六个字节上传至 Tomcat 服务器。
Tomcat 服务器在接收到这六个字节后,并不知道它们原始采用的是什么字符编码。而Tomcat默认的编码格式为 ISO-8859-1。所以会将这六个字节按照 ISO-8859-1 的格式进行编码,编码后在控制台显示,所以在控制台会显示乱码。
二、请求乱码解决方案
2.1 针对POST提交方式
在接收请求参数之前先通过 request 的 setCharacterEncoding()方法,指定请求体的字符编码格式。
注意:这种方式只能解决POST提交方式中的乱码问题,对于GET提交方式不起作用。因为该方法设置的是请求体中的字符编码,GET提交中的参数不出现在请求体中,而出现在请求行
2.2 针对GET提交方式
对于请求路径中所携带参数的解析,由 Tomcat 服务器完成。而 Tomcat 服务器的字符编码默认为 ISO8859-1,所以会将请求路径中所携带的数据,按照 ISO8859-1 进行编码。
可以通过修改Tomcat默认字符编码的方式来解决GET提交方式中携带中文的乱码问题。
重启 Tomcat 服务器后, GET 提交方式的中文乱码问题解决。
2.3 万能解决方案
该方式无需设置 Tomcat 中的 server.xml 中的 Tomcat 默认字符编码,无需设置 request 的请求体的字符编码。该方式针对 POST 与 GET 提交方式,均起作用。
三、响应乱码解决方案
response 对象获取流的编码字符集是 ISO-8859-1,浏览器默认的字符编码是 GBK(GB2312)
PrintWriter pw = response.getWriter(); // 获取的流的默认编码是 ISO-8859-1
【解决办法】:获取流对象之前,设置流的编码
response.setContentType("text/html;charset=utf-8");
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157139.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...