我们在开发中平常总是会遇到各种头疼的编码问题,那么怎么解决呢,看完这篇博客,你头再也不会疼了。。。
1、客户端通过post方式发送请求时乱码处理
原理如下:
仅当客户端通过post方式发送请求时,服务器端获取请求正文中参数值的解码方式,例如name=张三&age=8这种请求正文的中文参数
浏览器根据参数中文数据先进行utf-8编码,再根据url编码 ,服务器端根据request.getParameter()将获取到的参数先进行url解码,再根据utf-8解码
解决方式如下:在过滤器中或者每个servlet请求中添加如下代码
//仅当客户端通过post方式发送请求时,服务器端获取请求正文中的参数值的解码方式
//name=张三&age=8 浏览器根据参数中文数据先进行utf-8编码,再根据url编码
//服务器端根据request.getParameter()将获取到的参数先进行url解码,再根据utf-8解码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
2、客户端通过get方式发送请求时乱码处理
原理如下: tomcat8.0以上不会出现get方式中文乱码问题
当客户端通过get方式发送请求时,拼接在url后面的中文参数,中文参数先交给tomcat容器处理,tomcat8.0以上会默认采用utf-8解码,不会乱码,tomcat8.0以下根据ISO8859-1解码,所以导致乱码
解决方法如下:
方法一:可以通过设置tomcat文件的server.xml中配置<Connector URIEncoding="utf-8"/>
方法二:代码中使用 new String(request.getParameter().getBytes("ISO-8859-1"),"UTF-8");解决乱码
将获取的乱码参数先使用ISO-8859-1转换为原始根据ISO-8859-1编码前的字节数组,然后根据utf-8重新编码和解码
//当客户端通过get方式发送请求时,拼接在url后面的中文参数,中文参数交给tomcat容器,tomcat8.0以上会默认采用utf-8解码,8.0以下根据ISO8859-1解码
//方法一:可以通过设置tomcat文件的server.xml中配置<Connector URIEncoding="utf-8"/>
//方法二:代码中使用 new String(request.getParameter().getBytes("ISO-8859-1"),"UTF-8");
//将获取的乱码参数先使用ISO-8859-1转换为原始根据ISO-8859-1编码前的字节数组,然后根据utf-8重新编码和解码
3、数据库返回数据时中文乱码问题
在连接数据库时设置编码格式为utf8。useUnicode=true&characterEncoding=utf8
private static final String URL = "jdbc:mysql://127.0.0.1:3306/store?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
4、上传文件使用多表单数据中文乱码问题
注意:Tomcat 8.0以上统统没有乱码问题,tomcat内部已经默认按照utf-8进行解码
问题一:ServletFileUpload解析多部分表单的每个部分的请求头时,当获取上传文件的中文文件名(请求头)时,出现乱码,可以设置此解码格式,sfu.setHeaderEncoding("utf-8");8.0默认采用utf-8解码
//ServletFileUpload解析多部分表单的每个部分的请求头时,设置的解码格式
//当获取上传文件的中文文件名(请求头)时,出现乱码,可以设置此解码格式,8.0默认采用utf-8解码
sfu.setHeaderEncoding("utf-8");

请求正文的值(普通文件的值)的乱码,获取多表单提交数据普通文件请求正文的中文参数编码问题
在给对象中设置中文参数时,将item.getString("utf-8")传入,对获取的文件值进行解码,并存放到对象中。
// 6、解析请求,返回列表对象
List<FileItem> itemList = sfu.parseRequest(req);
String parthName = null, fileName = null, fileType = null, fileId = null;
UploadInfo uploadInfo = null;
int index = 0;
if (itemList != null && itemList.size() > 0) {
uploadInfo = new UploadInfo();
for (FileItem item : itemList) {
// 判断文件是普通文件还是多表单文件
if (item.isFormField()) {
// 普通文件
parthName = item.getFieldName(); // 获取普通文件字段名
if ("title".equals(parthName)) {
//多部分表单数据,每个部分的请求正文的值(普通文件的值)的解码方式
uploadInfo.setTitle(item.getString("UTF-8")); //对获取的文件名进行解码取值,并存放到对象中
}
}

5、jsp页面进行转码为servlet文件时的编码问题
在编写好的jsp页面中,写入<%@page pageEncoding="UTF-8"%>,表明该jsp以UTF-8形式进行编码为servlet,首先让编码格式正确,才能保证不乱码。
<%@page pageEncoding="UTF-8"%>
6、服务端响应的数据出现中文乱码问题
在服务器端返回给客户端文本/html时,需要设置响应格式为text/html,并且设置charset=UTF-8,说明服务器端是以utf-8进行编码,告诉浏览器必须使用utf-8进行解码,这样就能防止乱码了!
<%@page contentType="text/html; charset=UTF-8"%>
好了,今天的分享就到这里了,这篇博客带你解决一切头疼的编码问题,以后遇到哪种编码问题还会总结进来的。
您的点赞👍与关注是对小女子的最大支持,如果您还遇到什么编码问题,欢迎评论区留言哦!!!