实际在开发项目中,通过request跟response获取或返回中文字符的时候,时常会存在中文乱码问题,此文将常见的中文乱码问题略作分析并给出解决办法:


Request

1、通过Post方法传递表单数据的时候:
Tomcat服务器默认编码是ISO 8859-1,而浏览器使用的是UTF-8编码。浏览器的中文数据提交给服务器,Tomcat以ISO 8859-1编码对中文编码,在Servlet读取数据的时候,拿到的当然是乱码,
解决方法可以通过 request.setCharacterEncoding("UTF-8"),乱码的得以解决;

2、通过Get方法传递表单数据的时候:  
  Get方法用上述解决方法发现可能结果还是乱码,post方法是怎么进行参数传递的。当我们点击提交按钮的时候,数据封装进了Form Data中,http请求中把实体主体带过去了[传输的数据称之为实体主体],既然request对象封装了http请求,所以request对象可以解析到发送过来的数据,于是只要把编码设置成UTF-8就可以解决乱码问题。
  而get方式不同,它的数据是从消息行带过去的,没有封装到request对象里面,所以使用request设置编码是无效的。
解决办法:username = new String(request.getParameter("username").getBytes("ISO8859-1"),"utf-8");

当然,除了手动给传递的值转换编码外,也可以通过设置Tomcat的默认编码与浏览器的一致即可:在8080端口的Connector上加入URIEncoding="utf-8",设置Tomcat的访问该端口时的编码为utf-8,从而解决乱码,这种改法是固定使用UTF-8编码的。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>

另一种设置改服务器编码的方式。设置Tomcat的访问该端口时的编码为页面的编码,这种改法是随着页面的编码而变
  <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" /> 然后设置页面编码:request.setCharacterEncoding("UTF-8");


Response

调用getOutputStream()方法向浏览器输出数据
1、使用的是UTF-8编码,我们在字符串转换成字节数组时指定UTF-8编码:
   response.getOutputStream().write("怜我怜卿".getBytes("UTF-8"));
但这样做,页面显示很可能是乱码,因为浏览器采用的编码并不一定是UTF-8。

2、HTTP响应有对浏览器说明回送数据是什么类型的消息头,设置消息头的方法:

response.setHeader("Content-Type", "text/html;charset=UTF-8");
    response.getOutputStream().write("怜我怜卿".getBytes("UTF-8"));

浏览器在显示数据时,自动把页面的编码格式置换成UTF-8

3、使用html的标签模拟一个http消息头

response.getOutputStream().write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
           response.getOutputStream().write("怜我怜卿".getBytes("UTF-8"));
```     
**调用getWriter()方法向浏览器输出数据**
1、设置浏览器用UTF-8显示数据,内部还把中文转码的码表设置成UTF-8:
```       
      response.setContentType("text/html;charset=UTF-8");
      response.getWriter().write("怜我怜卿");

参考文章:java3y java3y