解决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() 替代它。