在使用原生的Servlet进行Web应用开发时经常会遇到一些中文乱码问题,造成乱码问题的原因只有一个:即客户端与服务端的字符编码不一致所导致的。
请求参数乱码问题
服务器端获取客户端传递过来的数据出现乱码的问题(即使用get获取post向服务器发送请求时出现乱码):
get与post请求的乱码处理时不一致的,当get请求时,其传递给服务器的数据时附加在URL地址之后的;而post的请求时,其传递给服务器的数据是作为请求正文传递给服务器。
● post请求的乱码处理:
用户在表单中填写的内容在请求正文中被提交给Servlet。当我们在表单中输入中文是,Servlet的request的编码与客户端不一致,则服务器无法解析,就会出现乱码。解决方法是改变请求正文中的字符编码(对于get请求无效,因为get提交表单的数据在URL中),方法如下:
request.setCharacterEncoding("UTF-8");
● get请求的乱码处理:
在服务器端获取get请求的参数时,可以使用String类的另外一个构造函数,这个构造函数可以指定字符串的编码形式。方法如下:
String username = request.getParameter("username");
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
get请求乱码问题还可以使用另外一种方法来解决,就是修改Tomcat默认的编码方式,方法如下:
在Tomcat的安装目录下,找到conf文件夹下的server.xml文件并打开,找到其中如下的代码:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
在Connector元素中添加URIEncoding属性,并将属性值修改为UTF-8,详情如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
响应数据乱码问题
在Servlet编程中,经常需要通过response对象将一些信息返回给浏览器给我们的客户端,而我们在服务器端显示的中文,但是响应给客户端浏览器却是乱码。这主要是由于response对象中的方法返回到浏览器的字符串默认使用"ISO-8859-1"字符集进行Unicode字符串到字节数组的转换,由于ISO8859-1字符集中根本就没有包含中文字符,所以Java在进行转换的时候会将无效的字符编码输出给客户端,于是便出现了乱码,为此ServletResponse接口中便定义了setCharaterEncoding、setContentType等方法来指定getWriter方法返回的PrintWriter对象所使用的字符集编码,所以我们在写Servlet程序中,在调用getWriter方法之前设置这些方法的值。我们为了防止乱码,经常将以下两条语句一起写上:
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
只要编写Servlet文件中含有响应给客户端的信息,那么就要写上这两句话。最好写上第二句话,因为它的优先级高,它的设置结果将覆盖setContentType等方法设置的字符编码集。