URL传参带特殊字符,js中对中文编码解码

时间:2022-11-02 20:16:22

URL传参带特殊字符,js中对中文编码解码


URL传参带特殊字符,js中对中文编码解码 
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的编码值是"%20"。 
如果不使用转义字符,这些编码就会当URL中定义的特殊字符处理。 


下表中列出了一些URL特殊符号及编码 十六进制值 
1.+ URL 中+号表示空格 %2B 

2.空格 URL中的空格可以用+号或者编码 %20 

3./ 分隔目录和子目录 %2F 

4.? 分隔实际的 URL 和参数 %3F 

5.% 指定特殊字符 %25 

6.# 表示书签 %23 

7.& URL 中指定的参数间的分隔符 %26 

8.= URL 中指定参数的值 %3D 

/*** 
  * 对 特殊字符进行重新编码 
  * **/ 
function URLencode(sStr){ 
     return escape(sStr).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F').replace(/\#/g,'%23'); 
   } 

在通过url传参时,有些特殊字符在jsp页面间传递时变成了%+ASCII码,所以在传递前对其进行编码,接收后再转码就OK了 
通过encodeURI()方法编码,再通过decodeURI()转码即可

URL编码与两次encodeURI


当使用地址栏提交查询参数时,如果不编码,非英文字符会按照操作系统的字符集进行编码提交到服务器,服务器会按照配置的字符集进行解码,所以如果两者不一致就会导致乱码。


encodeURI函数采用UTF-8对URL进行编码,所以如果服务器在进行解码时使用的是其他的编码方式就会出现乱码,默认的服务器配置的解码字符集都不是UTF-8,所以大部分情况下地址栏提交中文查询参数时会产生乱码;针对这种情况,可以连续使用两次encodeURI在客户端(主要指浏览器)对非英文字符进行编码,然后在服务端使用java.net.URLDecoder(String."UTF-8")解码,即可得到正确的中文。


原理:

如果只进行一次encodeURI,得到的是UTF-8形式的URL,服务器端通过request.getParameter()解码查询参数(通常是iso-8859-1)就会得到乱码。

如果进行两次encodeURI,第一次编码得到的是UTF-8形式的URL,第二次编码得到的依然是UTF-8形式的URL,但是在效果上相当于首先进行了一次UTF-8编码(此时已经全部转换为ASCII字符),再进行了一次iso-8859-1编码,因为对英文字符来说UTF-8编码和ISO-8859-1编码的效果相同。在服务器端,首先通过request.getParameter()自动进行第一次解码(可能是gb2312,gbk,utf-8,iso-8859-1等字符集,对结果无影响)得到ascii字符,然后再使用UTF-8进行第二次解码,通常使用java.net.URLDecoder("","UTF-8")方法。


两次编码两次解码的过程为:

UTF-8编码->UTF-8(iso-8859-1)编码->iso-8859-1解码->UTF-8解码,编码和解码的过程是对称的,所以不会出现乱码。