escape函数解决参数乱码

解决url或get方式传递中文参数时候,乱码问题。

 

格式:escape(中文字符串) 

 

url时候需要escape  2次,因为浏览器会解一次码。

get方式提交form只需要一次。

 

 

	var searchCityName=escape(escape(searchCityName));
	var url="http://xxx?add="+searchCityName;
	window.location.href=url;

 结果:

地址栏:http://xxx?add=%25u4E2D%25u56FD%253A%25u5E7F%25u4E1C%25u7701%253A%25u4E1C%25u839E%25u5E02

java服务端:%u4E2D%u56FD%3A%u5E7F%u4E1C%u7701%3A%u4E1C%u839E%u5E02 

说明浏览器转了一次。

 

 

			var value=escape(value);
			jQuery("#add").val(value);
			jQuery('#searchForm').submit();
html:
  <form id="searchForm" name="searchForm" method="get" action="$url">    
    <input type="hidden" name="add" id="add"  value="$!addEscape" />
  </form>

 

 结果:页面/java服务端:%u4E2D%u56FD%3A%u5E7F%u4E1C%u7701%3A%u4E1C%u839E%u5E02

 

      String  add = StringUtils.unescape(request.getParameter("add"));

       /**
	 * javascript unescape()的java实现
         */
	public static String unescape(String s) {
		StringBuffer sbuf = new StringBuffer();
		int i = 0;
		int len = s.length();
		while (i < len) {
			int ch = s.charAt(i);
			if (ch == '+') { // + : map to ' '
				sbuf.append(' ');
			} else if ('A' <= ch && ch <= 'Z') { // 'A'..'Z' : as it was
				sbuf.append((char) ch);
			} else if ('a' <= ch && ch <= 'z') { // 'a'..'z' : as it was
				sbuf.append((char) ch);
			} else if ('0' <= ch && ch <= '9') { // '0'..'9' : as it was
				sbuf.append((char) ch);
			} else if (ch == '-'
					|| ch == '_' // unreserved : as it was
					|| ch == '.' || ch == '!' || ch == '~' || ch == '*'
					|| ch == '\'' || ch == '(' || ch == ')') {
				sbuf.append((char) ch);
			} else if (ch == '%') {
				int cint = 0;
                if ((i+2)<len && 'u' != s.charAt(i+1)) {         // %XX : map to ascii(XX)
                    cint = (cint << 4) | val[s.charAt(i+1)];
                    cint = (cint << 4) | val[s.charAt(i+2)];
                    i+=2;
                } else { 
	                if(i+5<len){
	                	// %uXXXX : map to unicode(XXXX)
	                    cint = (cint << 4) | val[s.charAt(i+2)];
	                    cint = (cint << 4) | val[s.charAt(i+3)];
	                    cint = (cint << 4) | val[s.charAt(i+4)];
	                    cint = (cint << 4) | val[s.charAt(i+5)];
	                    i+=5;
                	}else{
                		return s;
                	}
                }
                sbuf.append((char)cint);
			}
			i++;
		}
		return sbuf.toString();
	}



       /**
	 * javascript escape()的java实现
         */
	public static String escape(String s) {
		StringBuffer sbuf = new StringBuffer();
		int len = s.length();
		for (int i = 0; i < len; i++) {
			int ch = s.charAt(i);
			if (ch == ' ') { // space : map to '+'
				sbuf.append('+');
			} else if ('A' <= ch && ch <= 'Z') { // 'A'..'Z' : as it was
				sbuf.append((char) ch);
			} else if ('a' <= ch && ch <= 'z') { // 'a'..'z' : as it was
				sbuf.append((char) ch);
			} else if ('0' <= ch && ch <= '9') { // '0'..'9' : as it was
				sbuf.append((char) ch);
			} else if (ch == '-'
					|| ch == '_' // unreserved : as it was
					|| ch == '.' || ch == '!' || ch == '~' || ch == '*'
					|| ch == '\'' || ch == '(' || ch == ')') {
				sbuf.append((char) ch);
			} else if (ch <= 0x007F) { // other ASCII : map to %XX
				sbuf.append('%');
				sbuf.append(hex[ch]);
			} else { // unicode : map to %uXXXX
				sbuf.append('%');
				sbuf.append('u');
				sbuf.append(hex[(ch >>> 8)]);
				sbuf.append(hex[(0x00FF & ch)]);
			}
		}
		return sbuf.toString();
	}

 

 

escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。语法escape(string)参数描述string必需。要被转义或编码的字符串。返回值已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。说明该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换。

提示和注释提示:可以使用 unescape() 对 escape() 编码的字符串进行解码。注释:ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。

 

 

你可能感兴趣的:(escape)