用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

小蜜锋    -  云代码空间

—— 技术宅拯救世界!

jsp乱码的解决方法

2013-04-02|1659阅||

摘要:1.页面静态内容乱码(非动态生成内容乱码) 这一般是<%@ page pageEncoding="UTF-8" %>设置的问题,建议在每个页面上都加上pageEncoding设定,让应用服务器能正确把JSP文件按照设定的编码转换为Java文件,只要这个pageEnco

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:
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     response.getWriter().write(request.getParameter("xxxxx"));
 }
这种情况下提交过来的表单数据其实是ISO-8859-1的编码,而返回给客户端又没有<%@ page contentType="text/html; charset=UTF-8" %>的设置,所以还是ISO-8859-1的编码,但是为什么没有乱码呢?其实已经乱码了,如果在第2行下断点的话,会发现request.getParameter("xxxxx")的返回值就是乱码。可以用一句Java代码来解释为什么客户端显示结果没有乱码,如下:
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代码来解释,如下:
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方法来说明问题:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      request.setCharacterEncoding("UTF-8");
      response.setCharacterEncoding("UTF-8");
      chain.doFilter(request, response);
 }

顶 1踩 0收藏
文章评论
    发表评论

    个人资料

    • 昵称: 小蜜锋
    • 等级: 高级设计师
    • 积分: 7088
    • 代码: 757 个
    • 文章: 360 篇
    • 随想: 211 条
    • 访问: 1261 次
    • 关注

    标签

    设计模式(4)java(9)命名规范(2)广告创意(1)愤怒的小鸟(1)游戏(5)jsp(1)配置(1)Surface(1)windows(1)javabean(1)设计方法(1)开发工具(2)web(4)大数据(2)GPU(1)硬盘(1)内部结构(1)黑客(1)窃取(1)编码(1)解决方法(1)php(28)mysql(9)数据库备份(1)数据库还原(1)命令(2)数据库(1)安装(1)2012(2)世界末日(3)仙剑5前传(1)默哀(1)电源(1)女生(1)装饰器模式(2)古剑奇谭(1)电脑桌(1)史上最牛(1)编程语言(2)小米(3)电视机顶盒(1)营销策略(1)Android(8)手势(1)诺亚方舟(1)Eclipse(1)汽车(1)操作系统(1)软件(1)互联网(5)大事记(1)设计师(2)壁纸(1)古剑奇谭2(1)古剑奇谭网络版(1)云计算(2)服务器(1)框架(2)Socket(1)jquery(1)构造函数执行顺序(1)火车票(1)3D(1)数据中心(2)正则表达式(2)Web前端(1)开发框架(1)系统瘫痪(1)12306(2)cpu(1)javascript(2)开发日记(15)体育馆管理系统(15)网页设计(1)CSS3(3)腾讯(3)小游戏(1)interface(1)平板(2)面试(2)设计(5)摄影(2)数据挖掘(1)钢琴谱(1)情人节(1)陈欧体(1)程序员(3)漫画(1)UserAgent(1)iPhone(2)NoSQL(1)ui(9)越狱(1)指南(1)abstract(1)css(3)git(2)八核(2)三星(1)linux(11)数据类型(1)html5(2)UML(2)perftools(1)创意(1)logo(1)色谱(1)响应式(5)Metro(2)虚拟机(1)jvm(1)垃圾回收(1)left(1)join(1)连接查询(1)溯源系统(1)Override(1)SAE(2)WordPress(1)指针(1)链表(1)系统分析师(1)中间件(1)corba(1)static(1)无线(1)监控(1)iPad(1)Apache(2)比特币(2)命名规则(1)手机支付(1)curl(3)笔记(1)导航(1)thinkphp(1)异常导致本地路径泄漏(1)web设计(1)网络安全(1)诗句(1)4K对齐(1)代码库(1)色彩(1)动画片(1)struts2(3)漏洞(5)确认框(1)心情驿站(1)ArscEditor(1)resources.(1)apktool(1)AppKey(1)新浪微博(1)app(5)广告(3)赚钱(1)响应式布局(1)html(1)淘宝(2)微信(1)重构(5)缓存(1)破解(1)后门(1)七夕(1)SEO(2)概念设计(1)面向对象(1)bootstrap(1)性能(2)优化(1)iis(1)爬虫(1)采集(1)算法(2)文本相似度(2)cto(1)js(1)fsockopen(1)扁平化设计(2)网页(1)心情(7)小米电视(1)开箱(1)励志(2)招聘(3)命名(1)notepad++(1)python(1)配色(3)扁平化(4)ps(2)搞笑(2)创业(3)渲染(1)电影(1)模板(1)微博(1)企业家(1)公司(1)总结(1)前端(1)运营(1)变形(1)svn(4)教程(3)搜狗(1)泄密(1)双11(1)天猫(1)UC(1)启动界面(1)光棍节(1)双十一(2)物流(1)备份(1)更新(1)插入(1)插件(2)jsTree(1)(1)海量数据(1)分辨率(1)草图(1)手绘(1)速度(1)文本处理(1)实习(1)感想(1)文件(1)简历(1)65.49.2.17(1)yum(1)解决办法(1)阿里云(2)推广(1)来往(1)春运(1)LBS(1)gb2312(1)utf-8(1)log4j(1)详解(1)收购(1)私服(1)TortoiseGi(1)post(1)异常(2)flappyBird(1)应用创新大赛(1)宙斯杯(1)学习方法(1)xp(1)退役(1)安全(1)技术贴(1)flash(1)刷机(1)京东(1)电商(1)Tomcat(1)JDK(1)免费(1)长投影(1)图标(1)Photoshop(1)云端集成开发环境(1)软件开发(1)可视化(1)工具(2)OpenSSL(1)Heartbleed(1)vsftp(1)中国知网(1)学术论文(1)免费下载(1)开发(1)手册(1)速查表(1)追随战略(1)sdk(1)文章(1)发布(1)文件管理(1)沙画(1)动效(2)原型(1)感悟人生(1)哲理(1)Bash(1)类图(1)知识管理(1)Console(1)调试命令(1)rpm(1)报错(1)挂载(1)数据盘(1)云主机(1)产品经理(1)原型设计(1)mql4(1)mt4(1)ea(1)程序化交易(1)CURLOPT_PO(1)阿里云​(1)CentOS6(2)OpenSSH(1)漏洞修复(2)升级(1)安骑士(1)链克(1)

    站长推荐