2011-08-16 18:29 JS中三种编码方式(escape,encodeURI,encodeURIComponent)

一 参考书 

0 http://hi.baidu.com/suofang/item/970a2ba6ea271cda5bf191ea
1  js编码http://blog.csdn.net/cnartstorm/archive/2009/06/23/4292460.aspx 
2 js 解决中文乱码函数-js中escape,encodeURI,encodeURIComponent三个函数的区别 
  http://blog.csdn.net/renhui15688/archive/2009/01/06/3710569.aspx 
二 各函数说明 
js对文字进行url编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 

A:  escape(String) 

escape函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。 
返回值:已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。 
说明:方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换。提示和注释 
提示:可以使用 unescape() 对 escape() 编码的字符串进行解码。 
注释:ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。 

B:encodeURI(string) 

定义:把字符串作为 URI 进行编码 
返回值: URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。 
说明: 该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。 
该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,# 
提示和注释: 提示:如果 URI 组件中含有分隔符,比如 ? 和 #,则应当使用 encodeURIComponent() 方法分别对各组件进行编码。 

C:encodeURIComponent 

返回值:URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。 
说明:该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。 
其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。 
提示和注释: 
提示:请注意 encodeURIComponent() 函数 与 encodeURI() 函数的区别之处,前者假定它的参数是 URI 的一部分(比如协议、主机名、路径或查询字符串)。因此 

encodeURIComponent() 函数将转义用于分隔 URI 各个部分的标点符号. 

三 示例 
工程,JSP页面编码使用UTF-8时,用js中的方法escape('中')进行编码,在java中要用EscapeUnescape.java进行解码,见附件,另外上传了,html,css3,W3school文档及编码的js文件,JS编码.zip 

  • JS编码比较.zip (16.2 KB)
  • 下载次数: 8
    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();
    
    	}
    
    	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();
    
    	}
     

你可能感兴趣的:(escape,encodeURI)