我们在javaWeb项目时,使用doget和dopost总是会出现各种原因的中文乱码问题,楼主在查阅大量资料后,将为什么有这样的问题,和如何解决这种问题做个总结。
思维导图:
输出到页面时中文会乱码
后端代码:
PrintWriter out = response.getWriter();
out.println("你好");
前端显示:
没有设置HttpServletResponse使用哪种编码,默认编码跟浏览器解码不匹配。
在PrintWriter out = response.getWriter();
之前添加这两句:
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
//设置HttpServletResponse使用UTF-8编码
response.setCharacterEncoding("UTF-8");
//通知浏览器使用UTF-8解码
response.setHeader("Content-type", "text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
或者在之前添加这一句:
response.setContentType("text/html;charset=utf-8");
//包含方案1的两种功能
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
以上两种方案添加其中之一后前端显示:
在java程序内部拿到的中文参数会是乱码
前端代码:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<form action="RequestParamsServlet" method="post">
用户名:<input name="username" type="text">
密码:<input name="password" type="text">
爱好:
<input type="checkbox" name="hobby" value="运动">运动
<input type="checkbox" name="hobby" value="游泳">游泳
<input type="checkbox" name="hobby" value="打乒乓球">打乒乓球
<input type="submit">
</form>
</body>
</html>
前端显示:
后端测试:
String username=request.getParameter("username");//传来的是中文参数
System.out.println(username);//控制台输出的中文乱码
控制台结果:
doGet:get提交是把参数数据队列加到提交表单的action属性所指的URL中,值和表单内各个字段对应,在URL中可以看到。简单来说get提交是不跟随requset请求体的。
浏览器设置的编码方式是UTF-8,而java程序内部设置的默认解码方式是ISO-8859-1,两者不同则会造成乱码;
而由于post提交和get提交的不同,两者解决中文乱码的方式也不同。
post提交经过请求体,对请求体设置解码方式即可解决乱码
在方法体开头添加:
//设置request对象的解码方式
request.setCharacterEncoding("utf-8");
get提交不经过请求体而是通过URL传参,设置requset解码方式无效,且tomcat版本不同解决方法不同,8.0版本是分界线
tomcat8.0之前对URL的默认解码方式是ISO-8859-1,而浏览器的编码方式是UTF-8,造成乱码。
方案1:
通过new String()方式转码:用getBytes(“ISO-8859-1“)拿到原编码的byte数组,再通过new一个String转成utf-8编码
String username=new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");
方案2:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
方案3:
使用过滤器方法,原理跟方案1一样,只不过不用每一个参数都写一次转码
方案4:
提供一个思路,get提交几乎每一点都比不上post提交,那么就使用post提交方式就好了。
tomcat8.0之后对URL的默认解码方式是UTF-8,而浏览器的编码方式是UTF-8,不会造成乱码
不需要再转码(切记,杠掉):String username=new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");
此时我们就不要傻乎乎的用getBytes(“ISO-8859-1“)解码了,反而会出现解码错误,造成乱码,直接使用参数即可。
启动tomcat还有运行时tomcat会产生乱码,原因是IntelliJ IDEA和tomcat的编码解码不一致造成。
现象如下:
IntelliJ IDEA控制台默认解码是GBK,而tomcat对控制台的默认编码是UTF-8,把一方改成一致即可解决,推荐修改tomcat对控制台的默认编码为GBK,因为windows的cmd控制台的默认解码也是GBK。
修改后
tomcat启动和运行时乱码在上方解决后,system.out.println打印server控制台乱码怎么办?
例如:tomcat7环境下
两个转码成UTF-8的字符串张三正常,而本身输出的字符串出现乱码
File Encodings编码设置不一致。
打开settings
点击convert
再次启动:
请参考本人另一篇博客:
亲测完全正确哦,有错误的同学注意查看tomcat的server.xml是不是加了多余的配置,或者idea编辑器的字符编码配置有错。
相信认真读到这里,关于中文乱码的问题已经了解
如果对你有所帮助,点赞支持一下作者~
因篇幅问题不能全部显示,请点此查看更多更全内容