response返回有两种,一种是字节流outputstream,一种是字符流printwrite。

先说字节流,要输出“中国",给输出流的必须是转换为utf-8的“中国”,还要告诉浏览器,用utf8来解析数据

 //这句话的意思,是让浏览器用utf8来解析返回的数据
response.setHeader("Content-type", "text/html;charset=UTF-8");
String data = "中国";
OutputStream ps = response.getOutputStream();
//这句话的意思,使得放入流的数据是utf8格式
ps.write(data.getBytes("UTF-8"));

再说字符流,要输出中国,需要设置response.setCharacterEncoding("UTF-8");

//这句话的意思,是让浏览器用utf8来解析返回的数据
response.setHeader("Content-type", "text/html;charset=UTF-8");
//这句话的意思,是告诉servlet用UTF-8转码,而不是用默认的ISO8859
response.setCharacterEncoding("UTF-8");
String data = "中国";
PrintWriter pw = response.getWriter();
pw.write(data);

request.setCharacterEncoding("UTF-8")的作用是设置对客户端请求进行重新编码的编码。
response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。

经验:1:如果中文返回出现??字符,这表明没有加response.setCharacterEncoding("UTF-8");这句话。

2:如果返回的中文是“烇湫”这种乱码,说明浏览器的解析问题,应该检查下是否忘加response.setHeader("Content-type", "text/html;charset=UTF-8");这句话。

jsp页面中开头的设置:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

1、pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码。

2、contentType="text/html;charset=UTF-8"的作用是指定对服务器响应进行重新编码的编码。

该设置和response.setCharacterEncoding("UTF-8")等效。

meta设置

指定网页使用的编码,该设置对静态网页尤其有作用。因为静态网页无法采用jsp的设置,而且也无法执行response.setCharacterEncoding()。例如:

如果同时采用了jsp输出和meta设置两种编码指定方式,则jsp指定的优先。因为jsp指定的直接体现在response中。

对于发送数据,服务器按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序,对要发送的数据进行编码。

对于接收数据,要分三种情况。一种是浏览器直接用URL提交的数据,另外两种是用表单的GET和POST方式提交的数据。

1、针对Post方式提交的请求如果出现乱码,可以每次在request解析数据时设置编码格式:

request.setCharacterEncoding("utf-8");

也可以使用编码过滤器来解决,最常用的方法是使用spring提供的编码过滤器:

在Web.xml中增加如下配置(要注意的是它的位置一定要是第一个执行的过滤器):

<filter>
<filter-name>charsetFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

该过滤器要做的其实就是强制为所有请求和响应设置编码格式:

request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");

2、针对Get方式的乱码问题,

post请求和get请求存放参数位置是不同的:

post方式参数存放在请求数据包的消息体中。get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value&parame2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用,对于URI字段中的参数不起作用。

此时可以在每次发生请求之前对URL进行编码:例如:Location.href="/encodeURI"("http://localhost/test/s?name=中文&sex=女");

当然也有更简便的方法,那就是在服务器端配置URL编码格式:

修改tomcat的配置文件server.xml:
             <Connector URIEncoding="UTF-8" 
                 port="8080"   maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               connectionTimeout="20000" disableUploadTimeout="true" />

只需增加 URIEncoding="UTF-8"  这一句,然后重启tomcat即可。、

对于表单提交数据默认是使用get方式,一般指定method="post"

这时乱码的解决就可以在web.xml中配置即可

两篇好的博文:

中文乱码在java中URLEncoder.encode方法要调用两次解决

详细剖析GET/POST提交如何编码以及服务器如何解码以及乱码解决方案

最新文章

  1. HR函数学习03——维护信息类型1008
  2. 网络包处理工具NetBee
  3. 通过ASP禁止指定IP和只允许指定IP访问网站的代码
  4. c++中enum的用法——枚举类型
  5. Chrome浏览器扩展开发系列之三:Google Chrome浏览器扩展的架构
  6. sar 命令详解
  7. 【BZOJ2127】happiness(最小割)
  8. Redis线程模型
  9. shell编程规范:引用
  10. 在Visual Studio里配置及查看IL
  11. win10安装Redis方法以及基本配置
  12. Git工具使用
  13. BZOJ 4552 [Tjoi2016&amp;Heoi2016]排序 线段树的分裂和合并
  14. linux 禁ping和开启ping方法
  15. 【python库安装问题解决】UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte 0xc0 in position 121: invalid start byte
  16. SPOJ_LCS
  17. C++运算符重载形式——成员函数or友元函数
  18. 怎样修复grub开机引导(grub rescue)
  19. EMGU 2.9.X在VS2010下调试真正靠谱的配置
  20. Go正则处理

热门文章

  1. Nodejs各种功能Module的收集整理
  2. Python - json和simplejson比较(转)
  3. 初涉Quartz
  4. lumen 单元测试
  5. python的OS库和正则表达式库
  6. Android无线测试之—UiAutomator UiDevice API介绍七
  7. Java 基础巩固:IO
  8. poj1676(转换为二进制求解)
  9. 1020 逆序排列(DP)
  10. joisino&#39;s travel