Servlet的Get与Post方法中中文乱码的不同处理
作者:ade 日期:2012-06-04
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