我们在javaWeb项目时,使用doget和dopost总是会出现各种原因的中文乱码问题,楼主在查阅大量资料后,将为什么有这样的问题,和如何解决这种问题做个总结。
1.先抛出doPost方法request.getParameter("xxx");乱码的解决方案
在方法体开头加:
//设置request对象的解码方式
request.setCharacterEncoding("utf-8");
这样得到的字符串编码格式就是utf-8,控制台中文乱码即可解决;(此时PrintWriter输出页面时乱码仍存在)
2.doGet和doPost使用PrintWriter out = response.getWriter();输出时乱码解决方案
在PrintWriter out = response.getWriter();前加:
//设置response返回输出的编码方式
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
相对于加这两句:
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
3.重头戏:doGet方法request.getParameter("xxx");乱码的解决方案
我们为什么喜欢用doPost?因为它安全,它容量无限,它是跟着requset请求体过来的数据,
也就意味着
request.setCharacterEncoding("utf-8");对它起作用!编码取值问题一句代码解决,可不快哉?
而doGet方法?不安全(URL后面会附带参数),容量小(最多1、2KB),数据不跟着requset请求体,而是放在URL后面!
也就意味着
request.setCharacterEncoding("utf-8");对doGet没有任何用,我们需要另外转码,天呐,好烦~
重中之中:tomcat版本不同,对url的默认解析编码不同
tomcat8.0版本之前
tomcat8.0版本之前,默认编码是ISO-8859-1
解决方案1:手动字符串转码
所以我们可以看见许多人解决doget中文乱码是这样的:
String username=new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");
因为默认编码是ISO-8859-1,用getBytes(“ISO-8859-1“)拿到原编码的byte数组,再通过new一个String转成utf-8编码。
但缺点是每一个参数都要转码,可以改到你大脑颤抖~
解决方案2:修改默认编码为UTF-8
既然默认编码是ISO-8859-1,那么修改默认编码就好
找到 tomcat目录\\conf\server.xml
添加 URIEncoding="UTF-8"
添加之后,解析编码就是UTF-8,doGet从页面拿值就不需要转码了
但此方法并不推荐,因为各个机子的环境不同,在你机子上能跑,去别人那就跑不了了。
解决方案3:过滤器转码
网上有例子:
他写的比较全,可以对dopost和doget都进行配置
tomcat8.0版本之后
tomcat8.0版本之后,默认编码是UTF-8,相当于是8.0版本之前加了URIEncoding="UTF-8"(即上方的解决方案2)
此时doget就很好用了,比dopost甚至还省了一行request.setCharacterEncoding("utf-8");
可喜可贺~
dopost还是老样子,该加的东西还得加!
4.具体实例
tomcat 7实例(没有对servlet.xml进行修改,默认编码为ISO-8859-1,doget需手动转码)
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(
urlPatterns = "/RequestParamsServlet"
)
public class RequestParamsServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置request对象的解码方式
request.setCharacterEncoding("utf-8");
//设置response返回输出的编码方式
response.setContentType("text/html;charset=utf-8");
String name = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("用户名:" + name);
System.out.println("密 码:" + password);
PrintWriter out = response.getWriter();
out.println("用户名:" + name);
out.println("密 码:" + password);
// 获取参数名为“hobby”的值
String[] hobbys = request.getParameterValues("hobby");
System.out.print("爱好:");
out.println("爱好:");
for (int i = 0; i < hobbys.length; i++) {
System.out.print(hobbys[i] + ",");
out.println(hobbys[i] + ",");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置response返回输出的编码方式
response.setContentType("text/html;charset=utf-8");
String name=new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");
String password=new String(request.getParameter("password").getBytes("ISO-8859-1"), "UTF-8");
System.out.println("用户名:" + name);
System.out.println("密 码:" + password);
PrintWriter out = response.getWriter();
out.println("用户名:" + name);
out.println("密 码:" + password);
// 获取参数名为“hobby”的值
String[] hobbys = request.getParameterValues("hobby");
System.out.print("爱好:");
out.println("爱好:");
for (int i = 0; i < hobbys.length; i++) {
hobbys[i]=new String(hobbys[i].getBytes("ISO-8859-1"),"UTF-8");
System.out.print(hobbys[i] + ",");
out.println(hobbys[i] + ",");
}
}
}
tomcat 9实例(没有对servlet.xml进行修改,默认编码为UTF-8,doget无需转码)
package org.hc.maven.testnew;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(
urlPatterns = "/RequestParamsServlet"
)
public class RequestParamsServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置request对象的解码方式
request.setCharacterEncoding("utf-8");
//设置response返回输出的编码方式
response.setContentType("text/html;charset=utf-8");
String name = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("用户名:" + name);
System.out.println("密 码:" + password);
PrintWriter out = response.getWriter();
out.println("用户名:" + name);
out.println("密 码:" + password);
// 获取参数名为“hobby”的值
String[] hobbys = request.getParameterValues("hobby");
System.out.print("爱好:");
out.println("爱好:");
for (int i = 0; i < hobbys.length; i++) {
System.out.print(hobbys[i] + ",");
out.println(hobbys[i] + ",");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置response返回输出的编码方式
response.setContentType("text/html;charset=utf-8");
String name = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("用户名:" + name);
System.out.println("密 码:" + password);
PrintWriter out = response.getWriter();
out.println("用户名:" + name);
out.println("密 码:" + password);
// 获取参数名为“hobby”的值
String[] hobbys = request.getParameterValues("hobby");
System.out.print("爱好:");
out.println("爱好:");
for (int i = 0; i < hobbys.length; i++) {
System.out.print(hobbys[i] + ",");
out.println(hobbys[i] + ",");
}
}
}
亲测完全正确哦,有错误的同学注意查看tomcat的servlet.xml是不是加了多余的配置,或者idea编辑器的字符编码配置有错。
相信认真读到这里,关于中文乱码的问题已经了解
如果对你有所帮助,点赞支持一下作者~