JSP中传参中文乱码

时间:2021-01-19 21:08:52

第一种方法:

1.传参处编码(编一次码

function open(){

var userName = document.getElementById("userName");

userName = encodeURI(userName);// 编一次码。注:encodeURI是JS函数
window.location.href="/test.do?userName=+userName;
}

2. action中:参数解码

String userName = request.getParameter("userName");

userName = new String(userName.getBytes("ISO8859_1"), "UTF-8");

===========================经验证可行===========================

第二种方法:

1.传参处编码(编两次码

function open(){

var userName = document.getElementById("userName");

userName = encodeURI(encodeURI(userName));// 要编两次码。注:encodeURI是JS函数
window.location.href="/test.do?userName=+userName;
}

2.action中:参数解码

String userName = request.getParameter("userName");

userName  = java.net.URLDecoder.decode(userName ,"utf-8");// 解一次码

===========================经验证可行===========================

编码与解码的次数解释(网上摘录):

一种说法:使用encodeURI转码后,会出现特殊字符,这时候,就需要将特殊字符也转码,所以使用两次encodeURI。在传参是浏览器会对参数进行一次解码,所以在Action中只需解码一次就可以了。

另一种说法:客户端对参数进行二次编码,可以有效的避开提交多字节字符”的这个棘手问题。因为第一次编码,你的参数内容便不带有多字节字符了,成了纯粹的 Ascii 字符串。(这里把编第一次的结果叫成 [STR_ENC1] 好了。[STR_ENC1] 是不带有多字节字符的)再编一次后,提交,接收时容器自动解一次 (容器自动解的这一次,不管是按 GBK 还是 UTF-8 还是 ISO-8859-1 都好,都能够正确的得到 [STR_ENC1])然后,再在程序中实现一次 decodeURIComponent (Java中通常使用 java.net.URLDecoder(***, "UTF-8")) 就可以得到想提交的参数的原值。