javaweb请求响应编码问题详解
javaweb请求响应编码问题详解
前言:
编码基础的概念
ISO-8859-1:单字节编码,英文编码。
GB2312/GBK:汉字编码,GBK兼容GB2312.
Unicode:java的编译编码。
UTF-8:可以用来表示所有语言的编码。
1、请求html文件乱码问题
解决:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
为什么请求html文件会乱码?
由于网页的编码方式和内容的编码方式不一样。在解析时就会出现乱码问题。
如何查看网页的编码方式?
打开浏览器控制台输入:document.characterSet
示例:
解析:由于内容中存在中文字符,所以需要文件的编码方式需要采用可编码中文的,一般就用UTF-8,采用不匹配的编码方式,会在文件中出现乱码问题。这里把网页解析的编码方式注释了,就会出现下面的情况。
总结:html 乱码问题,检查文件的编码方式和网页编码方式
(meta http-equiv="Content-Type" content="text/html; charset=utf-8" />)
在项目新建时。统一设置项目文件编码方式:UTF-8
2、JSP页面乱码问题
解决:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
访问jsp的本质是访问Servlet,JSP转换为java文件并编译到字节码文件的过程中存在编码。所以访问jsp文件的过程如下:
(ps:idea 的web项目默认存放路径 C:\Users\.IntelliJIdea2019.2\system\tomcat\Unnamed_coding\work\Catalina\localhost\coding_war_exploded\org\apache\jsp)
- 第一次:转换为.java文件;
JVM将JSP编译为.java文件。在这个过程中pageEncoding就起到作用了,JVM首先会获取pageEncoding的值,如果该值存在则采用它设定的编码来编译,否则则采用file.encoding编码来编译。如果不设置pageEncoding,会导致在转换成java文件时,中文出现乱码问题。 - 第二次:转换为.class文件;
JVM将.java文件转换为.class文件。在这个过程就与任何编码的设置都没有关系了,不管JSP采用了什么样的编码格式都将无效。经过这个阶段后.jsp文件就转换成了统一的Unicode格式的.class文件了。 - 第三次:业务逻辑处理后输出。
后台经过业务逻辑处理后将产生的结果输出到客户端。在这个过程中contentType的charset就发挥了功效。如果设置了charset则浏览器就会使用指定的编码格式进行解码,否则采用默认的ISO-8859-1编码格式进行解码处理。设置ContentType的作用等同于:response.setContentType(“text/html;charset=UTF-8”),设置了在浏览器的编码方式。
3、form表单Get提交编码问题
解决:
- 第一种方法:在tomcat的server.xml文件中设置编码方式
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
- 第二种方法:在servlet中 通过这种方式接收参数
String param1 = new String(req.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
分析:get请求提交数据时。其数据是附加在URL上,从Tomcat5.0以后,对URL的数据默认才用ISO-8859-1的方式进行编码,此时页面设置的编码无效( content=“text/html; charset=utf-8” /),所以这时单纯通过 req.setCharacterEncoding(“UTF-8”);是无效的,需要按以上的方法解决乱码问题。
4、form表单POST方式提交
解决:
req.setCharacterEncoding("UTF-8");
分析:Post提交的几种编码方式
1.application/x-www-form-urlencoded:原生form表单
2.multipart/form-data:上传文件时
3.application/json:JSON格式
4.text/xml
5、服务器端返回时 乱码问题
解决:
第一种方式:
response.setContentType("text/html;charset=utf-8");//设定返回的编码方式,告诉浏览器自适应当前的编码
第二种方式:
response.setHeader("content-type", "text/html;charset=utf-8");//等同于第一种
第三种方式:
response.setHeader("content-type", "text/html"); //等同于上面两种
response.setCharacterEncoding("utf-8");