您的位置:首页 > 编程语言 > Java开发

JavaWeb学习——Ajax提交URL中文参数乱码问题

2015-08-07 15:35 288 查看
    通过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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ajax url java web 编码 乱码