JS为什么有时候要做两次encodeURI
这个问题的根本原因是服务器会自己做一次解码,且解决的字符集不一定是UTF-8。
对于var url = "b.jsp?name="+u_name; 要想把中文的name传到后台,需要对url进行一次编码,否则是乱码。
A.
前端:var url1=encodeURI(url);
后台:String name=request.getParameter("name");
有时会乱码,为什么?
因为接收时, 直接
String paramValue = request.getParameter(paramName);
Tomcat容器会自动解码。
encodeURI使用的是 UTF-8 编码规则来编的。如果 request.getParameter(paramName) 时,容器也按 UTF-8 解的话,没有问题。如果容器没有按 UTF-8 解的话, 结果只有一个,就是乱码!
容器按什么编码来解码,决定于 request.setCharacterEncoding(***) 或者 服务器程序配置。如果能设置request.setCharacterEncoding("UTF-8")并修改服务器配置,让容器在解 GET 提交的参数时,使用UTF-8,则没有任何问题。
B.
前端:url1=encodeURI(url);
url2=encodeURI(url);
后台:String name1=request.getParameter("name");
String name2 = java.net.URLDecoder.decode(name1,"UTF-8");
不管容器用的什么编码,都不会有乱码:
url1会把url中的中文编为ASCII码。
url2对url1进行再编码,由于是对ASCII码进行编码,在request.getParameter("name")解码的时候,不管是按 GBK 还是 UTF-8 还是 ISO-8859-1 都好,都能够正确的得到url1。
因为ASCII码用GBK、UTF-8、ISO-8859-1编码的结果是相同的。