谁动了我的代码

抽象即是空,空即是抽象。
posts(43) comments(24) trackbacks(0)
  • BlogJava
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

News

所有文章版权归我所有,转载请注明出处,谢谢!

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • Android开发(5)
  • C/C++(1)
  • DataBase(3)
  • Java(16)
  • JavaScript(14)
  • WEB前端(1)
  • 编程杂项(2)
  • 网络(1)

随笔档案

  • 2016年5月 (1)
  • 2011年2月 (1)
  • 2010年6月 (3)
  • 2010年5月 (1)
  • 2009年12月 (2)
  • 2009年11月 (1)
  • 2009年10月 (2)
  • 2009年6月 (2)
  • 2009年5月 (1)
  • 2009年4月 (2)
  • 2009年3月 (4)
  • 2009年2月 (1)
  • 2009年1月 (1)
  • 2008年12月 (1)
  • 2008年11月 (1)
  • 2008年10月 (4)
  • 2008年9月 (2)
  • 2008年5月 (5)
  • 2008年3月 (3)
  • 2007年12月 (2)
  • 2007年10月 (1)
  • 2007年9月 (2)
  • 2007年5月 (1)

搜索

  •  

最新评论

  • 1. re: Android之ImageView载入网络上的图片
  • 222222222222222222222
  • --2222222222222222222222222222
  • 2. re: Log4j自带Log Viewer的用法
  • 执行你的根本不行,乱错帖子就在这乱贴,tmd
  • --asdf
  • 3. re: Android之使用私有存储
  • getDir方法创建的文件,会有个app_前缀,请问这怎么去掉呢?
  • --就是宝宝
  • 4. re: Android通用事件造成的生命周期变化情况
  • 我相信以后Android将成为越来越多设备的OS,不光是手持上网设置,冰箱、洗衣机都有可能采用Android。
  • --淘宝网女装春装新款
  • 5. re: Android通用事件造成的生命周期变化情况
  • 不错
  • --歌瑞尔内衣

阅读排行榜

评论排行榜

View Post

Tomcat乱码问题研究,附带AJAX乱码问题研究。

很奇怪测试了多个应用服务器,只有Tomcat出现了乱码问题。让我们来分析一下原因,测试环境是Tomcat5.5.27,字符集编码统一为UTF-8。

1.页面静态内容乱码(非动态生成内容乱码)
这一般是<%@ page pageEncoding="UTF-8" %>设置的问题,建议在每个页面上都加上pageEncoding设定,让应用服务器能正确把JSP文件按照设定的编码转换为Java文件,只要这个pageEncoding设置正确就可以避免静态内容的乱码。有人可能会说我没有设置也没有乱码,那是因为应用服务器还可以读取<%@ page contentType="text/html; charset=UTF-8" %>中的charset作为备选方案,虽然这是JSP规范中要求的,但是难保有的容器没有实现或实现有BUG,所以有时候在某个应用服务器下(如Tomcat)不设置pageEncoding也可以,但是同样的页面拿到别的应用服务器下就不能保证不出现乱码。

2.动态生成内容乱码
新下载的Tomcat没有经过任何特殊的设置,无论是GET和POST都出现乱码。首先设置HTTP Connector(server.xml中监听8080端口的那个Connector),加上URIEncoding="UTF-8",消除了GET乱码,再在JSP页面中第一句加入<% request.setCharacterEncoding("UTF-8"); %>,消除了POST乱码。
通过上面两个设置我们发现,URIEncoding控制的是GET字符集编码,Request的CharacterEncoding控制的是POST字符集编码。
如果没有上面那句
<% request.setCharacterEncoding("UTF-8"); %>,在页面起始加入<%= request.getCharacterEncoding() %>,在Tomcat下我们发现输出null,在其他服务器下却输出UTF-8。这就是为什么在Tomcat下应该正确设置Request的CharacterEncoding的原因。
上面提到的<%@ page contentType="text/html; charset=UTF-8" %>,除了声明返回给客户端的流是text/html外,同时设置了Response的CharacterEncoding,即相当于执行了Response.setCharacterEncoding("UTF-8")这段代码。它保证了服务器端生成的动态内容到达客户端也不会乱码。
但有一种情况下也不会出现乱码,就是如下例这种情况,前提是没有设置
Request的CharacterEncoding:
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
2     response.getWriter().write(request.getParameter("xxxxx"));
3 }
这种情况下提交过来的表单数据其实是ISO-8859-1的编码,而返回给客户端又没有<%@ page contentType="text/html; charset=UTF-8" %>的设置,所以还是ISO-8859-1的编码,但是为什么没有乱码呢?其实已经乱码了,如果在第2行下断点的话,会发现request.getParameter("xxxxx")的返回值就是乱码。可以用一句Java代码来解释为什么客户端显示结果没有乱码,如下:
1 System.out.println(new String("你好,世界".getBytes("ISO-8859-1"), "ISO-8859-1");
很奇怪这句代码,明明是中文,应该用GB2312或GBK之类的字符集编码来getBytes,却用了ISO-8859-1,事实证明,这种互逆操作对字符串本身没有任何影响,只要getBytes和new String的时候字符集编码是一致的就不会引起乱码。
上面这句代码正好说明了数据从客户端POST到服务器端时是ISO-8859-1编码,然后从服务器端写回到客户端还是ISO-8859-1编码,所以就没有造成乱码,如果这里不是直接写回到客户端,而是forward到另一个JSP页面,而这个页面恰好使用了
<%@ page contentType="text/html; charset=UTF-8" %>来设置Response的CharacterEncoding,那么在页面中输出xxxxx还会产生乱码,同样用一句Java代码来解释,如下:
1 System.out.println(new String("你好,世界".getBytes("ISO-8859-1"), "UTF-8"));
所以,最后结论是如果想POST到服务器端不乱码就要设置Request的CharacterEncoding,写回到客户端不乱码就要设置Response的CharacterEncoding,若是JSP页面要设置<%@ page contentType="text/html; charset=UTF-8" %>。

3.AJAX乱码问题(不借助任何JS框架,像Prototype之类的框架会对GET请求的queryString自动应用encodeURIComponent()编码)
GET请求时,需要对queryString使用encodeURIComponent()编码之后再提交到服务器。这是XMLHttpRequest规范所要求的。
POST请求时,不需要使用encodeURIComponent()。
通过对应用程序下断点发现,GET请求和POST请求的数据发送到服务器端都是正常的没有乱码,但是服务器端生成的动态内容写回客户端却是乱码,说明Response的CharacterEncoding设置错误,反过来我们再想一下,我们根本就没有设置过Response的CharacterEncoding,为什么呢?因为我们是以AJAX的方式提交表单,返回后不像JSP页面那样有<%@ page contentType="text/html; charset=UTF-8" %>来设置Response的CharacterEncoding,所以就会出错。

综合上述,解决的办法就是各大网站提出的通用解决方案Filter,如果你的应用没有用到AJAX,只设置Request的CharacterEncoding即可,否则Response的CharacterEncoding也要设置。下面是一个Filter的示例,只引用doFilter方法来说明问题:


1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
2     request.setCharacterEncoding("UTF-8");
3     response.setCharacterEncoding("UTF-8");
4     chain.doFilter(request, response);
5 }


posted on 2009-06-07 23:47 Eric Song 阅读(1007) 评论(0)  编辑  收藏 所属分类: Java

新用户注册  刷新评论列表  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问   管理
相关文章:
  • Java偏向锁实现原理讲解(Biased Locking)
  • Tomcat乱码问题研究,附带AJAX乱码问题研究。
  • jad和Java Decompiler的小小不同
  • Log4J基本使用教程
  • 使用Java范型需要注意的地方
  • Java事件传递技术 (链接至IBM网站)
  • Java集合框架使用注意事项(二,Map)
  • Java集合框架使用注意事项(一, List)
  • Tomcat对Servlet及JSP规范支持的情况
  • Java 5.0的新特性
 
 
Powered by:
BlogJava
Copyright © Eric Song