ajax 数据传递中的乱码问题

来源:互联网 发布:用ant执行sql 语句 编辑:程序博客网 时间:2024/06/05 17:28

最近做一个小项目,碰到这个问题,很让人恼火。

用的是ajax+jsp+struts 的结构

js代码如下:

    

  1. //创建XMLHttpRequest对象        
  2.     function createXMLHttpRequest() {
  3.         if(window.XMLHttpRequest) { //Mozilla 浏览器
  4.             XMLHttpReq = new XMLHttpRequest();
  5.         }
  6.         else if (window.ActiveXObject) { //IE浏览器
  7.             try {
  8.                 XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
  9.             } catch (e) {
  10.                 try {
  11.                     XMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
  12.                 } catch (e) {}
  13.             }
  14.         }
  15.     }
  16. //发送页面请求函数
  17.     function sendDataRequest(){
  18.         var url = "/resetPage.action?doing=buttonVal";
  19.         createXMLHttpRequest();
  20.         XMLHttpReq.open("GET", url, true);
  21.         XMLHttpReq.setRequestHeader( "Content-Type""text/html;charset=GBK" );
  22.         XMLHttpReq.onreadystatechange = processDataResponse;//指定响应函数
  23.         XMLHttpReq.send(null);  //发送请求
  24.     }
  25.     
  26.     //处理返回的信息
  27.     function processDataResponse() {
  28.         if (XMLHttpReq.readyState == 4) { //判断对象状态
  29.             if (XMLHttpReq.status == 200) { //信息已经成功返回,开始处理信息
  30.                 updateButton();
  31.             } else { //页面不正常
  32.                 alert("您所请求的页面有异常");
  33.             }
  34.         }
  35.     }
  36. function updateButton() {
  37.     var str =XMLHttpReq.responseText; 
  38.     alert(str);
  39. }

java代码:

  1. public ActionForward buttonVal ActionMapping mapping, ActionForm form,  HttpServletRequest request, HttpServletResponse response)throws Exception {
  2.             String str ="返回";
  3.             //传回响应数据
  4.             PrintWriter out=response.getWriter();
  5.             response.setContentType("text/html; charset=GBK");
  6.             response.setHeader("Cache-Control""no-cache");
  7.             response.setCharacterEncoding("UTF-8");
  8.             System.out.println("===response CharacterEncoding==="+response.getCharacterEncoding());
  9.             System.out.println("===response==ContentType==="+response.getContentType());
  10.             out.write(str);
  11.             out.close(); 
  12.         return mapping.findForward(null);
  13.     }

我的jsp代码里的编码<%@ page contentType="text/html; charset=GBK"%>

 

现在问题来了,返回的str总是??,baidu、Google 都是下面的解决办法:

Answer 1:

        用AJAX来GET回一个页面时,responseText里面的中文多半会出现乱码,这是因为XMLHttp在处理返回的responseText的时候,是把resposeBody按UTF-8编码进解码考形成的,如果服务器送出的确实是UTF-8的数据流的时候汉字会正确显示,而送出了GBK编码流的时候就乱了。解决的办法就是在送出的流里面加一个Header,指明送出的是什么编码流,这样XMLHttp就不会乱搞了。

PHP:header(’Content-Type:text/html;charset=GB2312′);
ASP:Response.Charset(”GB2312″)
JSP:response.setHeader(”Charset”,”GB2312″);

Answer 2:

        自己在js里写一个转码的函数。可以参考vbscript的实现。

        以下是一段参考代码:

        

  1. <script language="vbscript"
  2.     Function str2asc(strstr) 
  3.         str2asc = hex(asc(strstr)) 
  4.     End Function 
  5.     Function asc2str(ascasc) 
  6.         asc2str = chr(ascasc) 
  7.     End Function 
  8. </script> 

Answer 3:

        xtmlhttp 返回的数据默认的字符编码是utf-8,所以服务器要向客户端发送数据的时候,也要采用utf-8编码.如果上述方法仍然解决不了乱码问题,那你尝试一下把jsp,htm,java文件用UTF-8编码格式保存.

我尝试用方法1中的解决办法,在java代码中处理返回数据时添加了response.setHeader(”Charset”,”GBK″);没有效果!试了几种编码方式都不行。郁闷!。。。

在java的systemout 中打出来的log如下:   

  1. ===response CharacterEncoding===ISO-8859-1
  2. ===response==ContentType===text/html;charset=ISO-8859-1

看了这个log无语了,在java代码里的设置没有起作用!!看来是在Action中的HttpServletResponse response参数就已设置了 CharacterEncoding,后面的修改都不起作用。

 

偶然在网上看到一个关于javascript 的函数 escape ,然后Google了下,发现这个函数有点用,可以对字符进行转码,现在理解相当于是给你的字符加了层外壳。那在传值的时候就可以用escape“包装”下你的request的中文字符,传给后台java代码,然后在后台接收的时候,用unescape解开“包装”。处理完毕返回response的时候,在把处理好的数据用escape“包装”起来,这样在ajax的js代码中,我们就可以再使用unescape解开处理好的“数据包”。按照这个思路,成功解决了ajax传值的中文乱码问题!(呼~ 总算解决了,郁闷好多天了)。

 

下面是后台java代码中要用到的escape、Unescape。可以编写一个类,专门存放

 

  1. public class EscapeUnescape {
  2.     
  3.     public static String  escape (String src)    
  4.      {    
  5.          int i;    
  6.          char j;    
  7.          StringBuffer tmp = new StringBuffer();    
  8.          tmp.ensureCapacity(src.length() * 6);    
  9.        
  10.          for (i = 0; i < src.length(); i++) {    
  11.              j = src.charAt(i);    
  12.              if (Character.isDigit(j) || Character.isLowerCase(j) ||    
  13.                  Character.isUpperCase(j))    
  14.                  tmp.append(j);    
  15.              else {    
  16.                  if (j < 256) {    
  17.                      tmp.append("%");    
  18.                      if (j < 16)    
  19.                          tmp.append("0");    
  20.                      tmp.append(Integer.toString(j, 16));    
  21.                  } else {    
  22.                      tmp.append("%u");    
  23.                      tmp.append(Integer.toString(j, 16));    
  24.                  }    
  25.              }    
  26.          }    
  27.          return tmp.toString();    
  28.      }    
  29.        
  30.      public static String  unescape (String src)    
  31.      {    
  32.          StringBuffer tmp = new StringBuffer();    
  33.          tmp.ensureCapacity(src.length());    
  34.          int lastPos = 0, pos = 0;    
  35.          char ch;    
  36.          while (lastPos < src.length()) {    
  37.              pos = src.indexOf("%", lastPos);    
  38.              if (pos == lastPos) {    
  39.                  if (src.charAt(pos + 1) == 'u') {    
  40.                      ch = (char) Integer.parseInt(src.substring(pos + 2, pos + 6),    
  41.                                                   16);    
  42.                      tmp.append(ch);    
  43.                      lastPos = pos + 6;    
  44.                  } else {    
  45.                      ch = (char) Integer.parseInt(src.substring(pos + 1, pos + 3),16);    
  46.                      tmp.append(ch);    
  47.                      lastPos = pos + 3;    
  48.                  }    
  49.              } else {    
  50.                  if (pos == -1) {    
  51.                      tmp.append(src.substring(lastPos));    
  52.                      lastPos = src.length();    
  53.                  } else {    
  54.                      tmp.append(src.substring(lastPos, pos));    
  55.                      lastPos = pos;    
  56.                  }    
  57.              }    
  58.          }    
  59.          return tmp.toString();    
  60.      }    
  61. }

JavaScript 中可以直接使用escape和Unescape。

 

方法2、3有点复杂,增加了代码量和修改量,暂时不做考虑。

 

至此,终于对这个问题有了个交代,现在写出来,希望能给大家做个参考,同时,代码比较简单,写的比较仓促,希望大家多多提意见,有好的方法一起探讨。


 

原创粉丝点击