通过URL提交中文参数时,浏览器会先把中文编码转换成GBK或UTF-8(经测试,IE会转换成GBK,FireFox会转换成UTF-8),然后再发送给服务器,
服务器根据默认编码设置或
request.setCharcterEncoding()
进行解码。如若编解码顺序不一致就会导致乱码问题。
在之前一个项目中,我在客户端(即JS)没对包含中文参数的URL(http://localhost:8080/TranscodingWeb/Dialog.jsp?test=测试 )进行编码,然后在服务端中采用
String test = new String(request.getParameter("test“).getBytes(ISO-8859-1), "UTF-8");
进行解码。发现FireFox能正确显示,而IE11却显示乱码。这是浏览器对待中文参数的不同编码方式所致。
因此,我们在发送包含中文参数的URL时,可以先利用encodeURI()对URL进行统一编码,防止因不同浏览器编码不同引起乱码。
解决方式1:
客户端:
encodeURI(url)
服务端(服务器默认编码为ISO-8859-1):
String test = new String(request.getParameter("test“).getBytes(ISO-8859-1), "UTF-8");
URL编解码过程:
UTF-8(encodeURI())编码 -> ISO-8859-1(服务器)解码 -> getBytes(ISO-8859-1)编码 -> UTF-8解码。
解决方式2:
客户端:
encodeURI(encodeURI(url))
服务端:
<span style="font-size:18px;">URLDecoder.decode(request.getParameter("test“), "UTF-8")</span>
URL编解码过程:
UTF-8(encodeURI())编码 -> UTF-8二次编码 -> ISO-8859-1(服务器)解码 -> UTF-8(URLDecoder)解码。
为什么两次UTF-8编码后,可以用一次ISO-8859-1和一次UTF-8解码呢?这是因为第一次编码后多字节的中文参数已被编码成英文字符,而对英文字符来说,ISO-8859-1和UTF-8编码效果是一样的,都是单字节,所以这样也能正确解码。
参考资料:
http://blog.csdn.net/saygoodbyetoyou/article/details/16834395
http://blog.csdn.net/ultrani/article/details/8176122
版权声明:本文为博主原创文章,未经博主允许不得转载。