关于项目中出现的中文乱码问题:
1、乱码经常出现在什么位置上?
==》数据"传递"过程中的乱码
==》数据"展示"过程中的乱码==》数据"保存"过程中的乱码
2、数据保存过程中的乱码?
(1)最终保存到数据库表中的时候,数据出现乱码
(2)导致数据保存过程中的乱码包括以下两种情况:
第一种情况:在保存之前,数据本身就是乱码,保存到数据库表中的时候一定是乱码。
第二种情况:保存之前,数据不是乱码,但是由于本身数据库不支持简体中文,保存之后出现乱码。
3、数据展示过程中的乱码?
-最终显示到网页上的数据出现中文乱码。
(1) 经过执行java程序之后, java程序负责向浏览器向应的时候,中文出现乱码, 解决方式: 设置响应的内容类型,以及对应的字符编码方式:【浏览器默认是UTF-8,而开发环境默认为其他编码方式的情况】
java response. setContentType("text/html ; charset=UTF-8");
(2) 没有经过执行java程序,直接访问html页面,出现中文乱码,【浏览器默认是UTF-8,html页面没有设置UTF-8编码方式,而开发环境默认为其他编码方式的情况】
解决方式:
html <meta content="text/html ; charset=UTF-8">
4、数据传递过程中的乱码?
将数据从浏览器发送给服务 器的时候,服务器接收到的数据是乱码。
浏览器是这样发送数据给服务器的: dname=%E5%B8%82%E5%9C%BA%E9%83%A8
-“市场部对应的IS0- 8859- 1的编码: %E5%B8%82%E5%9C%BA%E9%83%A8
(1) ISO- 8859- 1是国际标准码,不支持中文编码,兼容ASCII码,又被称为latin1编码
(2)不管是哪个国家的文字,在浏览器发送给服务器的时候,都会采用ISO- 8859- 1的编码方式发送。
(3)发送给web服务器之后, web服务器不知道这些数据之前是什么类型的文字(中文or日文or英文? ),所以web服务器接收到的数据出现乱码。
总结:
数据传递过程中乱码产生原因:
浏览器使用的是UTF-8字符集,传输的时候把字符用utf-8编码变成字节码。Tomcat服务器默认是使用的是IS0-8859-1字符集,所以会把浏览器传过来的用utf-8编码的字节码使用IS0-8859-1字符集解码,因为编码跟解码使用的字符集不一致导致乱码。
解决数据传递过程中的乱码:
第一种解决方案:万能方式,既能够解决POST请求乱码,又能解决GET请求乱码
先将服务器中接收到的数据采用ISO- 8859- 1的方式解码,回归原始状态
再給定一种支持简体中文的编码方式重新编码组装。[组装的时候编码方式需要和浏览器的编码方式相同]
String dname = request.getParameter(”dname");
//第一种解决方式:万能解决方案, post和get都可以使用
byte[] bytes = dname.getBytes("IS0-8859-1"); //解码
dname = new String(bytes, "UTF-8"); //编码 [这里的编码方式,需要和浏览器的编码方式一致]
System.out.println(dname);
第二种解决方案: [只支持POST请求, 因为这种方式只对请求体编码]
request.setCharacterEncoding(“UTF-8”);
以上代码必须在从request中获取数据之前设置有效果。
//第二种解决方案:调用request的setCharacterEncoding方法,但是这种方式只适合POST清求,只对请求体编码
//告诉Tomcat服务器,请求体中的数据采用UTF-8的方式进行编码
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException {
request.setCharacterEncoding("UTF-8");
String dname = request.getParameter("dname");
System.out.println(dname);
}
第三种解决方案:专门解决GET请求的乱码问题,因为这种方式只对请求行编码
<Connector port ="8080" protocol="HTTP/1.1"
connectionTimeout ="20000"
redirectPort="8443"
URIEncoding ="UTF-8"/>
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException {
String dname = request.getParameter("dname");
System.out.println(dname);
}
Connector标签中都可以编写哪些属性呢?
帮助文档: CATALINA_ HOME \webapps \docs \config\http.html
例如:
(1)port端口
(2)maxThreads Tomcat服务器最高支持多少个线程并发执行, 默认值200
(3)URIEncoding设置请求行上的编码方式,解决GET请求乱码