servlet中文乱码方法

本文探讨了在使用GBK编码的环境中,通过servlet获取表单提交值时出现乱码的问题及解决办法。详细解释了为何浏览器未指定编码时,默认采用ISO-8859-1编码,并给出了正确的解码方式。

1 提交页编码为:GBK

2 servlet获取提交值用gbk解码

String s=new String(request.getParameter("tbxname").getBytes("ISO-8859-1"),"GBK");
 out.println(s);

 

原因请参考(引):

在 servlet引擎实现 request.getParameter("myparam")时,会先在一个缓存里找一下,如果没有,就会开始解析参数并把解析后的参数和其对应的值放入缓存中。而在解析参数时,servlet规范中规定:首先按照 request.getCharacterEncoding获取的编码对解析出来的byte进行编码,创建新的字符串。如果request.getCharacterEncoding 的值是null,则按照ISO-8859-1来进行编码。而现在大多的浏览器在发送数据时都没有发送客户端的数据编码。所以在没有预先设置过的情况下,引擎应该都是按着ISO-8859-1来处理参数的值。

    假如表单的参数实际值是“中国” 那么按着GBK的编码提交到服务器端的myparam的值对应的应是4个byte.假设 解析出来的byte 是paramBytes,那么引擎为我们放入参数缓存中的参数值就是这样的 new String(paramBytes,encoding);很明显本来2个字节参能表达一个汉字 ISO-8859-1来编码之后,每个字节都成了单独的一个字符:4个字节成了四个字符,这就是我们看到的乱码出现的原因。

请参考:ISO-8859-1

http://wiki.ccw.com.cn/ISO_8859-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值