Servlet的Get与Post方法中中文乱码的不同处理

TomCat以ISO-8859-1作为默认的编码,

也就是说当通过Get方式提交数据时,Servlet容器是以ISO-8859-1对接受过来的字节流进行编码的。如果恰好传来的数据确实是IS0-8859-1编码,那么是不会出现乱码的。如果不是,则会一般都会出现乱码。即使你设置了

request.setCharacterEncoding("gb2312");

解决方法就是把编码完的字符串再还原成原来的字节数据,如何还原?你用的是IS0-8859-1编的码, 你再用IS0-8859-1去解码就行了。得到原始字节数据后,再用指定的字符集编码即可。

 

示例

//login.html

========================

<a href="HelloWorld?username=你好世界">Get提交</a>

========================

HelloWorld Servlet的Get方法:

========================

response.setContentType("text/html;charset=gb2312");
        PrintWriter out = response.getWriter();       
       
        String username = request.getParameter("username");
       
        //www.vtimes.net, 注意下面的方法
        username = new String(username.getBytes("ISO-8859-1"),"gb2312");
       
        out.println(username);

========================

可以正常输出中文。

 

而对于Post来的数据, 使用

request.setCharacterEncoding("gb2312"); //参数是你项目使用的字符集

是有效的,一般不用做特殊处理

login.html

========================

 <form name="form1" action="HelloWorld" method="post">
username:<input name="username" type="text" />

<input name="submit" type="submit" value="submit" />
</form>
========================

HelloWorld Servlet的Post方法:

========================

       request.setCharacterEncoding("gb2312");
        response.setContentType("text/html;charset=gb2312");
        PrintWriter out = response.getWriter();
       
        String username = request.getParameter("username");
       
        out.println(username);

========================

也可以正常输出。

 

另外需要注意的是

如果直接在地址栏里输入:

 http://localhost:8080/HelloWorld/HelloWorld?username=你好世界

不同的浏览器会有不同的处理方式。所以输出的结果也有所不同。

在IE下上述的Servlet可以正常工作, 但是FireFox不行。好象是因为FireFox传递的数据都是经过了URL编码,这里没有编码,传送的时候又进行了解码就出问题了。这个有空可以再推敲下。

总之,为了保持程序的通用性,最好在URL里传参数不要用中文,用的话也要先用URLEncoder编码后传递。

 附一个关于URL编码问题的文章,总结得不错:http://blog.sina.com.cn/s/blog_67963cad0100ijxo.html

 


文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.