任何数据在计算机内部实际上都是以二进制的形式保存的,所以我们看得见的字符本质上都是以二进制的形式保存的。而字符集实际上就是看得见的字符和二进制数之间的一张对应表。
Web应用中的乱码问题主要对于请求【参数】乱码和响应【参数】乱码而,解决乱码问题的根本方法就是统一编码和解码的字符集。
核心代码☟
//设置服务器编码
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
//设置服务器解码
request.setCharacterEncoding("UTF-8");
//设置服务器、浏览器解码
response.setContentType("text/html;charset=UTF-8");
1."三码"概念
编码:将字符转换为二进制数。
解码:将二进制数转换为字符。
乱码:编码与解码使用的字符集不一致就会产生乱码。
2.服务器与浏览器默认编码与解码
服务器(如Tomcat) | 浏览器 | |
---|---|---|
编码 | ISO-8859-1(不支持中文) | meta charset=“UTF-8” |
解码 | ISO-8859-1(不支持中文) | GBK(支持少量中文) |
3.请求乱码
(浏览器<存在中文>---->服务器)浏览器编码的字符集与服务器解码的字符集不一致。
3.1.Get请求乱码【设置服务器编码】
(1)解决方案:设置url位置的解码问题。
(2)应用实施:修改Tomcat服务器的server.xml,添加字符集"URIEncoding=“UTF-8”。
方式一(本地定位路径进行修改) :
方式二(在工具中直接定位修改) :
(1)在eclipse或STS中的Tomcat镜像中修改即可生效。但如果将来删除当前Tomcat镜像,重新关联Tomcat,则会使设置失效,所以在Tomcat配置文件中最好也进行配置。
(2)第65行代码,添加“URIEncoding="UTF-8”即可,保存!
3.2.Post请求乱码 【设置服务器解码】
(1)解决方案:将服务器的解码设置为:UTF-8(因为浏览器默认编码为:UTF-8) 。
(2)应用实施:代码行中添加request.setCharacterEncoding(“UTF-8”)。
原理小结:
对于GET请求:GET请求是在URL地址栏中传递请求参数的,它会被Tomcat服务器自动解码,而Tomcat服务器默认的字符集也是ISO-8859-1,所以我们需要修改Tomcat服务器的字符集为UTF-8。由于请求参数是包含在请求行内的,无法通过request对象进行设置,所以需要在Server.xml文件中修改Connector标签,添加URIEncoding="utf-8"属性。
对于POST请求:post请求在Servlet中解码,默认的字符集是ISO-8859-1,不支持中文,所以我们需要修改Servlet的字符集为UTF-8。使用request.setCharacterEncoding(“UTF-8”);设置request对象使用UTF-8字符集对请求体中的内容进行解码。但需要注意的是,这个操作一定要在调用getParameter()方法之前进行。
4.响应乱码【设置浏览器解码】
(服务器<存在中文>---->浏览器)服务器编码的字符集与浏览器解码的字符集不一致。
(1)方式一
解决方案:将服务器编码设置为GBK(不建议) 。
应用实施:代码:response.setCharacterEncoding(“GBK”)。
(2)方式二
解决方案:将服务器编码与浏览器解码设置UTF-8 。
应用实施:代码行中添加response.setContentType(“text/html;charset=UTF-8”)(设置响应的内容类型)。
5.代码应用
自定义的一个servlet文件(java文件)
package com.codinglin.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class EncodingServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public EncodingServlet() {
super();
// TODO Auto-generated constructor stub
}
//(1)如果html中的method="get"
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置服务器解码
request.setCharacterEncoding("UTF-8");
//设置浏览器、服务器解码
response.setContentType("text/html;charset=UTF-8");
}
//(2)如果html中的method="post"
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
//设置服务器解码
request.setCharacterEncoding("UTF-8");
//设置浏览器、服务器解码
response.setContentType("text/html;charset=UTF-8");
}
}
注意,添加解决乱码的代码这个操作一定要在调用getParameter()、response.getWriter()方法之前进行,。
说明:服务器编码(UTF-8)需要在Tomcat等服务器中手动修改server.xml,这里就不再赘述!
☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!
☞本人博客:https://coding0110lin.blog.youkuaiyun.com/ 欢迎转载,一起技术交流吧!