原视频地址:https://www.bilibili.com/video/BV1vb41187jH?p=41
乱码经常出现在什么位置上?
- 数据”传递“过程中的乱码
- 数据“展示”过程中的乱码
- 数据“保存”过程中的乱码
数据保存过程中的乱码
- 最终保存到数据库表中的时候,数据出现乱码
- 导致数据保存过程中的乱码包括以下两种情况:
- 在保存之前,数据本身就是乱码,保存到数据库表中的数据一定是乱码
- 保存之前,数据不是乱码,但是由于数据库不支持简体中文,保存之后出现乱码
数据展示过程中的乱码
最终展示到网页上的数据出现中文乱码
经过执行java程序之后,java程序负责向浏览器响应的时候,中文出现乱码,怎么解决:
设置响应的内容类型,以及对应的字符编码方式
response.setContentType("text/html;charset=UTF-8");
没有经过执行java程序,直接访问html页面,出现中文乱码,怎么解决:
<meta content = "text/html;charset=UTF-8">
就是要让编写的html文件和浏览器的编解码方式相同。
数据传递过程中的乱码(Tomcat7.X)
将数据从浏览器发送到服务器的时候,服务器接受到的数据是乱码
浏览器是这样发送数据给服务器的:dname=%E5%B8%82%E5%9C%BA%E9%83%A8
”市场部“对应的ISO-8859-1的编码:%E5%B8%82%E5%9C%BA%E9%83%A8
ISO-8859-1是国际标准码,不支持中文编码,兼容ASCII,有称为latin1编码
不管是哪个国家的文字,在浏览器发送给服务器的时候,都会采用ISO-8859-1的编码方式发送
所以web服务器接收到的数据出现乱码
解决数据传递过程中的乱码
第一种解决方案
万能方式,既能解决POST请求乱码,又能解决GET请求乱码
先将服务器中接受到的数据采用ISO-8859-1的方式解码,回归原始转态(一堆二进制数),再给定一种支持简体中文的编码方式重新编码组装。【组装时的编码方式需要和浏览器的编码方式相同】
1
2
3
4
5
6
7
8
9
10public class SaveDeptServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String dname = request.getParameter("dname");
// 第一种解决方式:万能解决方案,POST和GET都可以使用
byte[] bytes = dname.getBytes("ISO-8859-1"); // 解码
dname = new String(bytes, "UTF-8"); // 编码【编码方式需要和浏览器的编码方式相同】
}
}第二种解决方案:【只支持POST请求,因为这种方式只对请求体编码】
request.setCharacterEncoding("UTF-8");
以上代码必须在从request中获取任何数据之前有效果
1
2
3
4
5
6
7
8public class SaveDeptServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 第二种解决方式:调用request的setCharacterEncoding方法,但是这种方法只适合POST请求,只对请求体编码。告诉Tomcat服务器,请求体中的数据采用UTF-8的方式进行编码
request.setCharacterEncoding("UTF-8");
String dname = request.getParameter("dname");
}
}第三种方案:专门解决get请求的乱码问题,因为这种方式只对请求行编码
修改CATALINA_HOME/conf/server.xml文件
1
2
3
4
5
6
7
8public class SaveDeptServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 第三种方式
String dname = request.getParameter("dname");
}
}在server.xml文件的
<connector>
中添加URLEncoding="UTF-8"
(在Tomcat8.X中默认是URLEncoding=”UTF-8”)1
2
3<!--Tomcat7.X-->
<Connector port = "8080" protocol="HTTp/1.1".....
URLEncoding="UTF-8"/>
<connector>
标签中都可以编写哪些属性呐?
可以参考CATALINA_HOME\webapps\docs\config\http.html