crazier9527 发表于 2013-1-23 02:55:42

防止url中出现汉字乱码

方法一:
地址:http://hi.baidu.com/comasp/blog/item/e13e928b4eeb59d2fc1f10d8.html
做ajax传递参数的时候遇到这个异常,在网上找了N天的东西,还是没找到答案,原来我一直没发现原来是 escape带来的错误。我是这样写的
var url = "b.jsp?name=" + escape(u_name);
服务端获取:
String name=request.getParameter("name");
name=new String(name.getBytes("iso-8859-1"));
System.out.println(name);
结果老是报错:org.apache.tomcat.util.http.Parameters processParameters
警告: Parameters: Character decoding failed. Parameter skipped.
java.io.CharConversionException: isHexDigit.
我知道是字符串转换异常,可是就不知道怎么样弄好。
后来听说是escapse的问题,于是开始找资料了。终于解决了。
先把url改下:
   var url = "b.jsp?name=" +u_name;
   url=encodeURI(url);
   url=encodeURI(url);    //写一个不行。如果写一个就是????号。
                                   //写2个,则输出 %df%a4这中.
服务端获取:
String name=request.getParameter("name");
name = java.net.URLDecoder.decode(name,"UTF-8");   //这句话一定要,因为如果不写的                                                                                      //话,编码 就 是%E5%A6%88%System.out.println(name);

方法二:对中文的变量做两次encode() 在js中做的 在java中取出来后做解密 调用工具类StringUtil
package com.struts.util;
public class StringUtil {
public static String formatString(Object obj) {
   if (obj == null)
    return "";
   else
    return obj.toString();
}
private final static byte[] val = { 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x01,
    0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F };
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 ('A' <= ch && ch <= 'Z') {
     sbuf.append((char) ch);
    } else if ('a' <= ch && ch <= 'z') {
     sbuf.append((char) ch);
    } else if ('0' <= ch && ch <= '9') {
     sbuf.append((char) ch);
    } else if (ch == '-' || ch == '_' || ch == '.' || ch == '!'
      || ch == '~' || ch == '*' || ch == '\'' || ch == '('
      || ch == ')') {
     sbuf.append((char) ch);
    } else if (ch == '%') {
     int cint = 0;
     if ('u' != s.charAt(i + 1)) {
      cint = (cint << 4) | val;
      cint = (cint << 4) | val;
      i += 2;
     } else {
      cint = (cint << 4) | val;
      cint = (cint << 4) | val;
      cint = (cint << 4) | val;
      cint = (cint << 4) | val;
      i += 5;
     }
     sbuf.append((char) cint);
    } else {
     sbuf.append((char) ch);
    }
    i++;
   }
   return sbuf.toString();
}
}
 
页: [1]
查看完整版本: 防止url中出现汉字乱码