专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » tomcat乱码:Tomcat在处理GET和POST请求时产生的乱码问题 »正文

tomcat乱码:Tomcat在处理GET和POST请求时产生的乱码问题

来源: 发布时间:星期四, 2008年12月18日 浏览:71次 评论:0
        有个朋友写JSP在Servlet中取请求参数时出现了乱码当然这种乱码问题再简单不过了由于在JSP中使用了GBK作用页面编码那么提交中文信息自然也会被按着GBK进行编码为%xx格式GBK编码
        要解决这个问题可以说是思路方法多多最简单就是使用request.CharacterEncoding思路方法设置编码格式如下面代码所示:

request.CharacterEncoding("GBK");

        在设置完编码格式的后就可以直接通过request.getParameter思路方法来获得请求参数中中文信息了当然为了方便,还可以在过滤器中加入上面语句这样所有Servlet都可以直接使用 request.getParameter思路方法来获得请求参数中中文信息了 除了这两种思路方法还可以不使用request.CharacterEncoding("GBK")而使用下面语言来转换编码:

String name = String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

        但为了更快解决这个问题我就直接告诉这位朋友使用了CharacterEncoding思路方法来设置编码但是说来奇怪还是出现乱码没有任何解决问题迹象 最郁闷事就是使用了自己认为100%能解决问题思路方法而这种思路方法却点都没起作用
        最后又让朋友试了最后种思路方法说来奇怪竟然好使了当然这也没什么可奇怪本来就应该好使但奇就奇在CharacterEncoding思路方法并没有去掉也就是说同时使用了下面两条语句竟然得到了正常中文请求参数值:

request.CharacterEncoding("GBK");
String name = String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
.out.prln(name);  //  正常输出中文请求参数


        按着常理来说这是不可能既然使用了CharacterEncoding思路方法设置成了GBK再使用 String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK")来转换得到应该是?????不可能是正常中文只有将CharacterEncoding思路方法去了以ISO-8859-1格式保存串才可以用ISO-8859-1格式还原再用GBK重新保存成Java串(这步实际上就是GBK转Unicode)

        但经过仔细研究后决定看下JSP代码是如何写不看不知道看吓原来<form>在提交时使用是GET而未用POST这当然没什么了不起用什么都可以但对编码就有问题了自从Tomcat5.x开始GET和POST思路方法提交信息Tomcat采用了区别方式来处理编码对于POST请求Tomcat会仍然使用request.CharacterEncoding思路方法所设置编码来处理如果未设置则使用默认iso-8859-1编码而GET请求则区别Tomcat对于GET请求并不会考虑使用request.CharacterEncoding思路方法设置编码而会永远使用iso-8859-1编码而这位朋友使用正好是GET请求因此tomcat将会使用iso-8859-1将提交字节转换成

解决思路方法有两个:
1.  将GET请求改成POST请求然后就可以使用request.CharacterEncoding思路方法设置编码并使用request.getParameter思路方法直接获得中文请求参数了
2.  不用改GET请求在Servlet中使用如下代码来得到中文请求参数

String name = String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");


        综上所述如果使用了GET请求CharacterEncoding思路方法不起作用只能使用上面代码来解决而使用POST请求尽管CharacterEncoding思路方法起作用但使用上面代码仍然好使(在这时不能使用CharacterEncoding思路方法将编码格式设置成非iso-8859-1格式)因此如果想让Servlet可以同时处理GET和POST请求中中文信息除了判断这两种思路方法外还可以使用上面代码来同时处理这两种请求中文信息

        笔者建议使用如下代码来获得中文请求参数:

String name = String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");


        上面代码是利用了Java编码能力对于所有Web服务器都会有效CharacterEncoding思路方法是通过Web服务器支持并不是所有Web服务器都会对该思路方法有很好支持

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: