Servlet14—— 程序中乱码解决方案

乱码出现在这么几个位置上

  1.  数据传递过程中的乱码:将数据从浏览器发送给服务器的时候,服务器接受到的数据是乱码。
  2.  数据保存过程中的乱码:最终保存到数据库表中的时候,数据出现乱码。
  3.  数据展示过程中的乱码:最终显示到网页上的数据出现中文乱码。

1、数据传递过程中的乱码

假如使用表单formweb服务器发送请求提交数据,如果数据中有简体中文,在服务器端Servlet中使用“String value = request.getParameter(String name);”则一定会出现中文乱码问题。因为在网络传输数据的过程中,不能直接传送中文,浏览器是先将中文采用ISO-8859-1的方式进行预先编码,这种编码方式是不支持中文的,所以在服务器端如果不做任何处理,直接从request对象中获取的简体中文一定是乱码。比如:浏览器发送数据给服务器dname=%E5%B8$82%E5%9C%BA%E9%83%A8,市场部对应的ISO-8859-1(国际标准码,不支持中文编码,兼容ASCII码,有被称为latin1编码)的编码为%E5%B8$82%E5%9C%BA%E9%83%A8,不管是哪个国家的语言,在浏览器发送给服务器的时候,都会采用ISO-8859-1的编码方式发送,这样发送给web服务器之后,web服务器不知道这些数据之前是什么类型,所以web服务器收到数据出现乱码。

解决方案包括以下两种方式:

1、我们可以将从request中获取的数据采用ISO-8859-1的方式进行解码,让这个数据再次回到正常的byte[]数组状态,然后再采用一种支持中文的编码方式进行编码,这种方式是一种万能的方式,适合所有的情况,但是前提是必须直到原先采用的原始的编码方式是什么,关键是能够让我们的数据再回到原始状态(byte[]数组),但是这种方式的缺点就是太麻烦,如果表单中提交的数据量比较大,编码量也就随着庞大起来。

String dname = request.getParameter("dname");

// 第一种解决方式:万能解决方案,post和get都可以使用

byte[] bytes = dname.getBytes("ISO-8859-1"); //解码

dname = new String(bytes,"GBK"); //编码【这里的编码方式,需要和浏览器的编码方式一致】

2、调用request对象的一个特定的方法就可以完成乱码的处理:“request.setCharacterEncoding(“GB18030”);”但是这行代码必须出现在从request对象中获取任何数据之前设置才起作用。这个方法只处理请求体中的乱码问题,对请求行中的乱码不起作用。这个方法只在从request中获取任何数据之前设置有效果。(处理POST请求中的乱码问题)

//第二种解决方案:调用request的setCharacterEncoding方法,但是这种方法只适合POST请求,只对请求体编码

//告诉Tomcat服务器,请求体中的数据采用UTF-8的方式进行编码

request.setCharacterEncoding("UTF-8");

String dname = request.getParameter("dname");

3、关于GET请求中的乱码问题,主要是告诉Tomcat服务器请求行中采用什么样字符编码方式,我们可以去修改TOMCAT服务器中的CATALINA/conf/server.xml文件,将server.xml文件中配置端口号的标签末尾添加URIEncoding=”GB18030”,这样就可以解决GET请求中的中文乱码问题。

Connector标签中可以编写的属性在CATALINA_HOMEwebappsdocsconfighttp.html(帮助文档)中。

  • port 端口
  • maxThreads Tomcat服务器最高支持多少个线程并发执行,默认值200
  • URIEncoding 设置请求行上的编码方式,解决GET请求乱码

2、数据保存中出现的乱码问题

  • 数据保存指的是数据库中的乱码问题,有的时候我们在数据库表中存储的中文无法正常显示,显示为乱码,为什么我们当前的这个ORACLE数据存储中文不会出现乱码问题呢?因为我们在安装Oracle数据库的时候指定了字符的编码方式是支持简体中文的。大家以后在使用mysql数据库的时候,安装之前必须手动设置该数据库采用的字符编码方式,如果采用mysql数据库默认的字符编码方式的话,是会出现中文乱码问题的。大家一定要注意手动修改mysql数据库的字符编码方式。
  • 还有一种情况本身数据库是支持简体中文的,但是在保存之前数据已经是乱码,保存之后必然还是乱码。

3、数据展示过程中的乱码

Servlet使用HttpServletResponse这个响应对象向浏览器客户端响应HTML代码,默认情况下,如果响应中有中文的话,会出现乱码问题,我们需要在获取响应流之前设置响应的内容类型以及字符编码方式,使用这种方式可以解决数据展示过程中的乱码问题:“response.setContentType(“text/html;charset=GB18030”);”需要注意的是这段代码必须在获取响应流out之前设置才起作用。响应的内容类型不要写错了,如果写错了,则是文件下载。

如果没有经过经过java代码,直接访问html页面,会出现中文乱码,就在<head></head>中加上<meta context="text/html;charset=UTF-8">

 

转载请注明出处:https://www.cnblogs.com/stu-jyj3621
原文地址:https://www.cnblogs.com/stu-jyj3621/p/14369644.html