用javaScript向Servlet/JSP(GBK)进行传值的问题解决

随着AJAX的流行。Java世界也开始改变。

出现了大量的AJAX框架。

但是总有一部分人。总有那么一些人。就是TM的喜欢自己实现。

比如,我。

当然。我也用了框架,但是呢,有的时候用自己做的会好一点。

SOSO。但是却有中文乱码问题。因为我服务器端用的是GBK编码。

直接使用JS传参数,服务器取就是null。

于是在JS定义如下:

/**
  * 防止乱码的转码
  * */
EncodeUtil.encoding = function(str){
str = encodeURI(str);
str = encodeURI(str);
return str;
}

这个是用来对传递的参数值进行转码

如:"myHello.jsp?userName="+userName;

这段代码是在JS中出现的。我需要传递userName到服务器去。

那么在这句之前,我需要做这么一步:

userName = EncodeUtil.encoding(userName);

好了。你可以尝试alert输出一下。

可以看见的是一串你看不懂的东西。

那就对了。



那么在对应的服务器端对应的进行转码。

你可以用java.net.URLDecoder.decode(str,encode);

DEMO:userName = URLDecoder.decode(getUserName,"UTF-8");

getUserName是用request取到的。

因为JS中默认是用的UTF-8编码。所以我们要将这个转换为当前系统的默认编码。

以上是JDK1.4或更高版本可用。

如果是JDK1.3。那么需要自己写一个转换。

如下:
 /**
  * 将指定字符s转码为enc指定的编码数据
  * @param String 要进行转码的字符
  * @param String 指定的编码
  * @return String 经过转码的字符
  * */
 public static String decode(String s, String enc) throws UnsupportedEncodingException {
  boolean needToChange = false;
  StringBuffer sb = new StringBuffer();
  int numChars = s.length();
  int i = 0;
  if (enc.length() == 0) {
   throw new UnsupportedEncodingException("URLDecoder: empty string enc parameter");
  }//end if
  while (i < numChars) {
   char c = s.charAt(i);
   switch (c) {
    case '+':
     sb.append(' ');
     i++;
     needToChange = true;
     break;
    case '%':
     try {
      byte[] bytes = new byte[ (numChars - i) / 3];
      int pos = 0;

      while (( (i + 2) < numChars) && (c == '%')) {
       bytes[pos++] = (byte) Integer.parseInt(s.substring(i + 1, i + 3),16);
       i += 3;
       if (i < numChars) {
        c = s.charAt(i);
       }
      }//end while
      if ( (i < numChars) && (c == '%')) {
       throw new IllegalArgumentException("URLDecoder: Incomplete trailing escape (%) pattern");
      }//end if

      sb.append(new String(bytes, 0, pos, enc));
     }catch (NumberFormatException e) {
      throw new IllegalArgumentException("URLDecoder: Illegal hex characters in escape (%) pattern - " + e.getMessage());
     }//end catch
     needToChange = true;
     break;
    default:
     sb.append(c);
     i++;
     break;
   }//end switch
  }//end while
  return (needToChange ? sb.toString() : s);
 }//end method[decode]




以上所有方式均为本人从网络中收集整理而成。非原创。

你可能感兴趣的:(JavaScript,c,Ajax,jsp,servlet)