有些符号在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传递参数的格式为url?param=value&param=value
当参数中包含特殊字符的时候就会出现混乱甚至错误,例如空格,字符&等等。所以JavaScript提供了一个escape函数对字符串进行编码操作,可惜的是,这个编码操作对于JAVA来说,是不适合的,使用escape编码是以/u开头,而Java使用的Unicode编码则是二进制编码。而且更加令人失望的是,使用escape编码的字符串会使得服务端的JSP得不到值。

有强人搞了一个解决方案,使用两次escape,具体的原理也很简单,但是不得不佩服这些高人,能有这种招数,同时在服务端提供了一套函数解码


public  
  static  
  String unescape( 
  String src) 
  
    { 
  
        StringBuffer tmp =  
  new StringBuffer(); 
  
        tmp.ensureCapacity(src.length()); 
  
         
  int lastPos = 0,pos = 0; 
  
         
  char ch; 
  
         
  while(lastPos < src.length()) 
  
        { 
  
            pos = src.indexOf( 
  "%",lastPos); 
  
             
  if(pos == lastPos) 
  
            { 
  
                 
  if(src.charAt(pos + 1) == 'u') 
  
                { 
  
                    ch = ( 
  char) Integer.parseInt(src.substring(pos + 2,pos + 6),16); 
  
                    tmp.append(ch); 
  
                    lastPos = pos + 6; 
  
                } 
  
                 
  else 
  
                { 
  
                    ch = ( 
  char) Integer.parseInt(src.substring(pos + 1,pos + 3),16); 
  
                    tmp. 
  
                        append(ch); 
  
                    lastPos = pos + 3; 
  
                } 
  
            } 
  
             
  else 
  
            { 
  
                 
  if(pos == -1) 
  
                { 
  
                    tmp.append(src.substring(lastPos)); 
  
                    lastPos = src.length(); 
  
                } 
  
                 
  else 
  
                { 
  
                    tmp.append(src.substring(lastPos,pos)); 
  
                    lastPos = pos; 
  
                } 
  
            } 
  
        } 
  
         
  return tmp. 
  toString(); 
  
    } 
  
     
  public  
  static  
  String escape( 
  String src) 
  
    { 
  
         
  int i; 
  
         
  char j; 
  
        StringBuffer tmp =  
  new StringBuffer(); 
  
        tmp.ensureCapacity(src.length() * 6); 
  
         
  for(i = 0;i < src.length();i++) 
  
        { 
  
            j = src.charAt(i); 
  
             
  if(Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j)) 
  
            { 
  
                tmp.append(j); 
  
            } 
  
             
  else  
  if(j < 256) 
  
            { 
  
                tmp.append( 
  "%"); 
  
                 
  if(j < 16) 
  
                { 
  
                    tmp.append( 
  "0"); 
  
                } 
  
                tmp.append(Integer. 
  toString(j,16)); 
  
            } 
  
             
  else 
  
            { 
  
                tmp.append( 
  "%u"); 
  
                tmp.append(Integer. 
  toString(j,16)); 
  
            } 
  
        } 
  
         
  return tmp. 
  toString(); 
  
    }


 

 

-------------------------------------------------------------------------------------

 

一.中文乱码产生的原因
a)乱码有很多种,这里所说的是指web传入的乱码,即由浏览器传输数据到服务器发生的乱码。

b)常用的web传输方法有 post 和 get 2种,下面分别说明:
i.        Post – 由于采用了特殊的加密,所以只要设置正确的Character Encoding即可,不会产生乱码
ii.        Get - 用此类方法传输的数据将以字符串的形式直接放在url后面,所以采用的是url 的encode,这种情况不仅会出现中文乱码,而且假如参数里面带有保留字符也将被转义,特别地,如果参数中带有&字符,将丢失后面的所有参数或者值


二.解决办法
解决中文乱码(应该说是数据传输问题),主要应该从用法上解决。上面说了post方法只要设置了正确的 Character Encoding,是不会产生乱码的,所以应尽量采用post方法来传输数据;但是有时候采用get方法是比较方便的,或者是必须的,所以下面也分别介绍 2种的对应解决方案:
a)        Post – 在web.xml设置filter,filter-class指定为平台的SetCharacterEncodingFilter类,encoding设置为页面使用的编码,示例:

<filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>
                //自己实现一个filter。。
        </filter-class>
        <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
        </init-param>
</filter>
<filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>



b)        Get – 解决的关键在于在传输之前调用url encoder对参数进行加密,采用的encoding应与服务器的encoding一致,这样接收到数据的时候可以不做任何的转码。可由java和javascript2种办法实现:
i.        Java 实现方法(推荐)
1.        条件 - 如果要传输的数据是要先经过javabean生成,然后write 到页面上的,可以采用这种方式。以下略,用java.net.URLEncoder.encode();


ii.        Javascript 实现方法
如果需要从页面获取输入,则可以采用这种方式,但是这种情况又可以考虑是否可以转换为post方法来传输。
            下面是javascript的encode函数:
1.        escape - 采用ISO Latin字符集对指定的字符串进行编码。不会被此方法编码的字符: @ * / +

2.        encodeURI - 把URI字符串采用UTF-8编码格式转化成escape格式的字符串不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '

3.        encodeURIComponent - 把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! * ( ) '

<script type="text/javascript"> 
 </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>