目录
1、解决乱码的思路:都是统一字符编码和字符解码的字符集,建议都用UTF-8
2、准备知识
3、http响应html页面乱码:tomcat发给浏览器
3.1 设置发送端(servlet)对html页面编码的字符集
3.2 设置接收端(浏览器)对html页面解码的字符集
4、http响应数据乱码:servlet发送给浏览器等客户端
4.1 设置发送端(servlet)对数据编码的字符集
4.2 设置接收端(浏览器等)对数据解码的字符集
5、http get请求参数乱码:浏览器发送给后端servlet
5.1 设置发送端(浏览器)url编码的字符集
5.2 设置接收端(servlet)url解码的字符集
5.2.1 方案1【推荐】:设置tomcat解码的字符集为UTF-8
5.2.2 方案2【不推荐】:通过new String()方式转码
5.2.3 方案3【推荐】:使用过滤器方法给所有servlet参数转码
5.2.4 方案4:用post
6 http post请求参数乱码:浏览器发送给后端servlet
6.1 设置发送端(浏览器)的对请求体(post参数放入请求体)编码的字符集
6.2 设置接收端(servlet)解码的字符集
6.2.1 方案1【不推荐】:通过req.setCharacterEncoding("UTF-8")方式转码
6.2.2 方案2【推荐】:使用过滤器方法给所有servlet参数转码
7、http响应jsp页面乱码:tomcat发给浏览器
7.1 设置发送端(servlet)对jsp页面编码的字符集
7.1.1 方式一【不推荐】:以idea为例,右下角可以修改jsp等文件编码
7.1.2 方式二【推荐】:在文件头设置 pageEncoding,idea的jsp文件编码以此为准(右下角编码变灰色,不可改)
7.1.3 方式三【推荐】:在文件头设置 contentType="text/html;charset=UTF-8",该设置会覆盖“方式二”的设置(看下面的源码)
7.2 设置接收端端(浏览器等)对jsp页面解码的字符集
7.2.1 方式一【不推荐】:
7.2.2 方式二【推荐】:在文件头设置 pageEncoding
7.2.3 方式三【推荐】:在文件头设置 contentType="text/html;charset=UTF-8",该设置会覆盖“方式二”的设置(看下面的源码)
8、tomcat日志在idea种乱码
参考:
【JavaWeb开发】Servlet彻底解决开发中请求(get/post)、应答以及控制台中文乱码问题
1、解决乱码的思路:都是统一字符编码和字符解码的字符集,建议都用UTF-8 2、准备知识
2.1 HTML URL 编码参考手册 | 菜鸟教程
2.2 javaweb servlet
Servlet 教程 | 菜鸟教程
3、http响应html页面乱码:tomcat发给浏览器测试代码
3.1 设置发送端(servlet)对html页面编码的字符集Title
以idea为例,右下角可以修改html等文件编码
3.2 设置接收端(浏览器)对html页面解码的字符集
1、浏览器解码时优先读取响应头的Content-Type中的字符集,没有则读取标签中的字符集。 不同浏览器默认(自动)解码的字符集不固定(以系统编码为准居多),可以右键设置当前页面解码和编码的编码字符集 2、对于html文件,无法设置响应头的Content-Type中的字符集,只需在标签中添加
补充:IE和360浏览器可以右键修改编码字符集,修改后解码和 编码都以修改后的为准,但是只对本浏览窗口有效
4、http响应数据乱码:servlet发送给浏览器等客户端测试url:http://localhost:8080/lishuoboy_javaweb_war_exploded/A01Servlet
servlet 测试 代码:
@WebServlet(name = "A01Servlet", value = "/A01Servlet") public class A01Servlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.getWriter().println("name=硕"); } }
乱码图例:
4.1 设置发送端(servlet)对数据编码的字符集4.2 设置接收端(浏览器等)对数据解码的字符集以下3个都可以,如果都设置了,那么后面的覆盖前面的,其中resp.setCharacterEncoding("UTF-8");只能覆盖content-type的charset的值
【不推荐】resp.setCharacterEncoding("UTF-8");
推荐使用下面两个,因为下面两个设置了字符编码还在响应头设置了content-type,就是告诉浏览器解码字符集
【推荐】resp.setContentType("text/json;charset=utf-8"); // 前面的 text/json;可根据具体情况选择,一般json居多
【推荐】resp.setHeader("content-type", "text/json;charset=UTF-8"); // 前面的 text/json;可根据具体情况选择,一般json居多
以下2个都可以,如果都设置了,那么后面的覆盖前面的。下面两个设置会在响应头设置了content-type,就是告诉浏览器解码字符集
resp.setContentType("text/json;charset=utf-8"); // 前面的 text/json;可根据具体情况选择,一般json居多
resp.setHeader("content-type", "text/json;charset=UTF-8"); // 前面的 text/json;可根据具体情况选择,一般json居多
设置后,setContentType之后,http响应头会有对应参数content-type,浏览器就知道响应数据的字符集了
补充:IE和360浏览器可以右键修改编码字符集,修改后解码和 编码都以修改后的为准,但是只对本浏览窗口有效
5、http get请求参数乱码:浏览器发送给后端servletget提交不经过请求体而是通过URL传参
测试url:
url编码前 http://localhost:8080/lishuoboy_javaweb_war_exploded/A01Servlet?name=硕
url编码后 http://localhost:8080/lishuoboy_javaweb_war_exploded/A01Servlet?name=%E7%A1%95
可以看到URL编码后“硕”变成了“%E7%A1%95”,有三个%,说明是用UTF8字符集编码的,因为UTF8字符集一个汉字占用3个字节。GBK一个汉字占用2个字节
servlet 测试 代码:
@WebServlet(name = "A01Servlet", value = "/A01Servlet") public class A01Servlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) { String name = req.getParameter("name"); System.out.println("name=" + name); } }
乱码图例:
5.1 设置发送端(浏览器)url编码的字符集如果是纯url,现在主流新版浏览器都是(谷歌、IE、火狐)用UTF-8字符集对URL的非ASCⅡ字符进行编码,无需设置。
如果是html或jsp等文件,url编码与当前文件解码的字符集一致。如第3.2节所说:浏览器解码优先读取响应头的Content-Type中的字符集,没有则读取
标签中的字符集。如果是html页面form表单,发送的url则与当前页面的解码编码一致
5.2 设置接收端(servlet)url解码的字符集 5.2.1 方案1【推荐】:设置tomcat解码的字符集为UTF-8tomcat8.0之后默认的解码的字符集就是UTF-8,无需设置
tomcat8.0之前默认的解码的字符集是ISO-8859-1,需要设置,设置方法:修改tomcat目录下/conf/server.xml文件,设置 URIEncoding="UTF-8"。
5.2.2 方案2【不推荐】:通过new String()方式转码
假如tomcat URI解码的字符集是“ISO-8859-1“,即配置为URIEncoding="UTF-8",用getBytes(“ISO-8859-1“)拿到原编码的byte数组,再通过new一个String转成UTF-8编码
优缺点:每个servlet、每个参数都需要转码(可以给所有参数写个for循环转码)
5.2.3 方案3【推荐】:使用过滤器方法给所有servlet参数转码原理跟方案2一样,只不过不用每一个参数都写一次转码
具体写法:过滤器(解决中文乱码get/post)_mtm001的专栏-CSDN博客_乱码过滤器
优缺点:每个参数都需要转码(可以给多个参数写个for循环),但不用每个servlet都转
5.2.4 方案4:用post提供一个思路,get提交几乎每一点都比不上post提交,那么就使用post提交方式就好了。
6 http post请求参数乱码:浏览器发送给后端servletpost提交经过请求体而不是通过URL传参
测试html页面表单:
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>Title
servlet 测试代码:
@WebServlet(name = "A01Servlet", value = "/A01Servlet") public class A01Servlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException { String name = req.getParameter("name"); System.out.println("name=" + name); } }
乱码情况:
6.1 设置发送端(浏览器)的对请求体(post参数放入请求体)编码的字符集不同浏览器默认解码的字符集不固定(以自动识别或以系统编码为准居多),手工设置需在
标签中添加html或jsp等文件,发送中的字符编码与当前文件解码的字符集一致。如第3.2节所说:浏览器解码优先读取响应头的Content-Type中的字符集,没有则读取
标签中的字符集。补充:IE和360浏览器可以右键修改编码字符集,修改后解码和 编码都以修改后的为准,但是只对本浏览窗口有效
h1
6.2 设置接收端(servlet)解码的字符集 6.2.1 方案1【不推荐】:通过req.setCharacterEncoding("UTF-8")方式转码注意点:req设置编码前不能get过参数,否则就不好使了
优缺点:每个servlet都需要转码
6.2.2 方案2【推荐】:使用过滤器方法给所有servlet参数转码原理跟方案1一样,只不过不用每一个servlet都做一次转码
注意点:req设置编码前不能get过参数,否则就不好使了
优缺点:不用每个servlet都转码
7、http响应jsp页面乱码:tomcat发给浏览器 7.1 设置发送端(servlet)对jsp页面编码的字符集html或jsp等文件,发送中的字符编码与当前文件解码的字符集一致。如第3.2节所说:浏览器解码优先读取响应头的Content-Type中的字符集,没有则读取
标签中的字符集。 7.1.1 方式一【不推荐】:以idea为例,右下角可以修改jsp等文件编码 7.1.2 方式二【推荐】:在文件头设置 pageEncoding,idea的jsp文件编码以此为准(右下角编码变灰色,不可改)看一下jsp翻译的java原文件,该设置不仅设置了文件编码,还设置响应头的contentType,告诉浏览器
7.1.3 方式三【推荐】:在文件头设置 contentType="text/html;charset=UTF-8",该设置会覆盖“方式二”的设置(看下面的源码)看一下jsp翻译的java原文件,该设置不仅设置了文件编码,还设置响应头的contentType,告诉浏览器编码字符集
7.2 设置接收端端(浏览器等)对jsp页面解码的字符集 7.2.1 方式一【不推荐】: 7.2.2 方式二【推荐】:在文件头设置 pageEncodingidea的jsp文件编码以此为准(右下角编码变灰色,不可改)
看一下jsp翻译的java原文件,该设置不仅设置了文件编码,还设置响应头的contentType,告诉浏览器
7.2.3 方式三【推荐】:在文件头设置 contentType="text/html;charset=UTF-8",该设置会覆盖“方式二”的设置(看下面的源码)看一下jsp翻译的java原文件,该设置不仅设置了文件编码,还设置响应头的contentType,告诉浏览器编码字符集
8、tomcat日志在idea种乱码修改tomcat目录下conf/logging.properties文件,ConsoleHandler.encoding=UTF-8
参考: 【JavaWeb开发】Servlet彻底解决开发中请求(get/post)、应答以及控制台中文乱码问题欢迎分享,转载请注明来源:内存溢出
评论列表(0条)