`
xiaoyaocao
  • 浏览: 273837 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ajax 数据传递中的乱码问题

 
阅读更多

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

用的是ajax+jsp+struts 的结构

js代码如下:

  1. //创建XMLHttpRequest对象
  2. functioncreateXMLHttpRequest(){
  3. if(window.XMLHttpRequest){//Mozilla浏览器
  4. XMLHttpReq=newXMLHttpRequest();
  5. }
  6. elseif(window.ActiveXObject){//IE浏览器
  7. try{
  8. XMLHttpReq=newActiveXObject("Msxml2.XMLHTTP");
  9. }catch(e){
  10. try{
  11. XMLHttpReq=newActiveXObject("Microsoft.XMLHTTP");
  12. }catch(e){}
  13. }
  14. }
  15. }
  16. //发送页面请求函数
  17. functionsendDataRequest(){
  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. functionprocessDataResponse(){
  27. if(XMLHttpReq.readyState==4){//判断对象状态
  28. if(XMLHttpReq.status==200){//信息已经成功返回,开始处理信息
  29. updateButton();
  30. }else{//页面不正常
  31. alert("您所请求的页面有异常");
  32. }
  33. }
  34. }
  35. functionupdateButton(){
  36. varstr=XMLHttpReq.responseText;
  37. alert(str);
  38. }

java代码:

  1. publicActionForwardbuttonVal ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
  2. Stringstr="返回";
  3. //传回响应数据
  4. PrintWriterout=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("===responseCharacterEncoding==="+response.getCharacterEncoding());
  9. System.out.println("===response==ContentType==="+response.getContentType());
  10. out.write(str);
  11. out.close();
  12. returnmapping.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. <scriptlanguage="vbscript">
  2. Functionstr2asc(strstr)
  3. str2asc=hex(asc(strstr))
  4. EndFunction
  5. Functionasc2str(ascasc)
  6. asc2str=chr(ascasc)
  7. EndFunction
  8. </script>

Answer 3:

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

<wbr><p dir="ltr" style="MARGIN-RIGHT: 0px">我尝试用方法1中的解决办法,在java代码中处理返回数据时添加了<font color="#ff0000">response.setHeader(”Charset”,”GBK″);</font>没有效果!试了几种编码方式都不行。郁闷!。。。</p> <p dir="ltr" style="MARGIN-RIGHT: 0px">在java的systemout 中打出来的log如下:</p> <div class="highlighter"> <ol class="highlighter-c"> <li><span>===responseCharacterEncoding===ISO-8859-1</span></li> <li class="alt"><span>===response==ContentType===text/html;charset=ISO-8859-1</span></li> </ol> </div> <p>看了这个log无语了,在java代码里的设置没有起作用!!看来是在Action中的HttpServletResponseresponse参数就已设置了CharacterEncoding,后面的修改都不起作用。</p> <p></p> <p>偶然在网上看到一个关于javascript 的函数 escape ,然后Google了下,发现这个函数有点用,可以对字符进行转码,现在理解相当于是给你的字符加了层外壳。那在传值的时候就可以用escape“包装”下你的request的中文字符,传给后台java代码,然后在后台接收的时候,用unescape解开“包装”。处理完毕返回response的时候,在把处理好的数据用escape“包装”起来,这样在ajax的js代码中,我们就可以再使用unescape解开处理好的“数据包”。按照这个思路,成功解决了ajax传值的中文乱码问题!(呼~ 总算解决了,郁闷好多天了)。</p> <p></p> <p>下面是后台java代码中要用到的escape、Unescape。可以编写一个类,专门存放</p> <p></p> <div class="highlighter"> <ol class="highlighter-j"> <li> <span class="keyword">public</span><span></span><span class="keyword">class</span><span>EscapeUnescape{</span> </li> <li class="alt"><span></span></li> <li> <span></span><span class="keyword">public</span><span></span><span class="keyword">static</span><span>Stringescape(Stringsrc)</span> </li> <li class="alt"><span>{</span></li> <li> <span></span><span class="keyword">int</span><span>i;</span> </li> <li class="alt"> <span></span><span class="keyword">char</span><span>j;</span> </li> <li> <span>StringBuffertmp=</span><span class="keyword">new</span><span>StringBuffer();</span> </li> <li class="alt"> <span>tmp.ensureCapacity(src.length()*</span><span class="number">6</span><span>);</span> </li> <li><span></span></li> <li class="alt"> <span></span><span class="keyword">for</span><span>(i=</span><span class="number">0</span><span>;i&lt;src.length();i++){</span> </li> <li><span>j=src.charAt(i);</span></li> <li class="alt"> <span></span><span class="keyword">if</span><span>(Character.isDigit(j)||Character.isLowerCase(j)||</span> </li> <li><span>Character.isUpperCase(j))</span></li> <li class="alt"><span>tmp.append(j);</span></li> <li> <span></span><span class="keyword">else</span><span>{</span> </li> <li class="alt"> <span></span><span class="keyword">if</span><span>(j&lt;</span><span class="number">256</span><span>){</span> </li> <li> <span>tmp.append(</span><span class="string">"%"</span><span>);</span> </li> <li class="alt"> <span></span><span class="keyword">if</span><span>(j&lt;</span><span class="number">16</span><span>)</span> </li> <li> <span>tmp.append(</span><span class="string">"0"</span><span>);</span> </li> <li class="alt"> <span>tmp.append(Integer.toString(j,</span><span class="number">16</span><span>));</span> </li> <li> <span>}</span><span class="keyword">else</span><span>{</span> </li> <li class="alt"> <span>tmp.append(</span><span class="string">"%u"</span><span>);</span> </li> <li> <span>tmp.append(Integer.toString(j,</span><span class="number">16</span><span>));</span> </li> <li class="alt"><span>}</span></li> <li><span>}</span></li> <li class="alt"><span>}</span></li> <li> <span></span><span class="keyword">return</span><span>tmp.toString();</span> </li> <li class="alt"><span>}</span></li> <li><span></span></li> <li class="alt"> <span></span><span class="keyword">public</span><span></span><span class="keyword">static</span><span>Stringunescape(Stringsrc)</span> </li> <li><span>{</span></li> <li class="alt"> <span>StringBuffertmp=</span><span class="keyword">new</span><span>StringBuffer();</span> </li> <li><span>tmp.ensureCapacity(src.length());</span></li> <li class="alt"> <span></span><span class="keyword">int</span><span>lastPos=</span><span class="number">0</span><span>,pos=</span><span class="number">0</span><span>;</span> </li> <li> <span></span><span class="keyword">char</span><span>ch;</span> </li> <li class="alt"> <span></span><span class="keyword">while</span><span>(lastPos&lt;src.length()){</span> </li> <li> <span>pos=src.indexOf(</span><span class="string">"%"</span><span>,lastPos);</span> </li> <li class="alt"> <span></span><span class="keyword">if</span><span>(pos==lastPos){</span> </li> <li> <span></span><span class="keyword">if</span><span>(src.charAt(pos+</span><span class="number">1</span><span>)==</span><span class="string">'u'</span><span>){</span> </li> <li class="alt"> <span>ch=(</span><span class="keyword">char</span><span>)Integer.parseInt(src.substring(pos+</span><span class="number">2</span><span>,pos+</span><span class="number">6</span><span>),</span> </li> <li> <span></span><span class="number">16</span><span>);</span> </li> <li class="alt"><span>tmp.append(ch);</span></li> <li> <span>lastPos=pos+</span><span class="number">6</span><span>;</span> </li> <li class="alt"> <span>}</span><span class="keyword">else</span><span>{</span> </li> <li> <span>ch=(</span><span class="keyword">char</span><span>)Integer.parseInt(src.substring(pos+</span><span class="number">1</span><span>,pos+</span><span class="number">3</span><span>),</span><span class="number">16</span><span>);</span> </li> <li class="alt"><span>tmp.append(ch);</span></li> <li> <span>lastPos=pos+</span><span class="number">3</span><span>;</span> </li> <li class="alt"><span>}</span></li> <li> <span>}</span><span class="keyword">else</span><span>{</span> </li> <li class="alt"> <span></span><span class="keyword">if</span><span>(pos==-</span><span class="number">1</span><span>){</span> </li> <li><span>tmp.append(src.substring(lastPos));</span></li> <li class="alt"><span>lastPos=src.length();</span></li> <li> <span>}</span><span class="keyword">else</span><span>{</span> </li> <li class="alt"><span>tmp.append(src.substring(lastPos,pos));</span></li> <li><span>lastPos=pos;</span></li> <li class="alt"><span>}</span></li> <li><span>}</span></li> <li class="alt"><span>}</span></li> <li> <span></span><span class="keyword">return</span><span>tmp.toString();</span> </li> <li class="alt"><span>}</span></li> <li><span></span></li> <li class="alt"><span></span></li> <li><span>}</span></li> </ol> </div> <p class="alt"><span>JavaScript 中可以直接使用escape和Unescape。</span></p> <p class="alt"><span></span></p> <p>方法2、3有点复杂,增加了代码量和修改量,暂时不做考虑。</p> <p></p> <p>至此,终于对这个问题有了个交代,现在写出来,希望能给大家做个参考,同时,代码比较简单,写的比较仓促,希望大家多多提意见,有好的方法一起探讨。</p> <p dir="ltr" style="MARGIN-RIGHT: 0px"><br></p></wbr>
分享到:
评论

相关推荐

    Ajax传递中文参数到后台乱码的有效解决方法

    使用Ajax传递中文参数,如果不对参数进行处理的话,传到后台会变成乱码,经测试可以使用如下方法 这里是以jquery.autocomplete插件中获取输入框中的数据传到后台为例: 注意要对中文使用encodeURI编码两次 代码如下:...

    JQuery ajax 返回json时出现中文乱码该如何解决

    最近有朋友反映使用jquery.ajax调用返回json时出现中文乱码,遇到此问题,非常棘手,下面小编帮大家解决JQuery ajax 返回json时出现中文乱码问题,感兴趣的朋友跟着一起了解了解吧

    jQuery ajax方法传递中文时出现中文乱码的解决方法

    主要介绍了jQuery ajax方法传递中文时出现中文乱码的解决方法,涉及jQuery操作ajax的相关参数及编码的设置方法与注意事项,需要的朋友可以参考下

    asp.net中在用ajax格式传递数据到aspx页面时出现乱码

    asp.net中在用ajax格式传递数据到aspx页面时有时会出现乱码,以下为解决方法 js中 : 代码如下: XmlHttp.open(“POST”, “test.aspx”, false); XmlHttp.setRequestHeader(“Content-Type”, “application/x-...

    jQuery Ajax传值到Servlet出现乱码问题的解决方法

    最近在学jquery ui,在做一个小功能的时候需要将前台的值获取到,通过Ajax传递给Servlet,然后再在返回数据结果,但是在Servlet接受参数的时候,通过后台打印,发现接受乱码,代码示例如下: public void doGet...

    用ajax传递json到前台中文出现问号乱码问题的解决办法

    后来发现,因为在controller中返回json用了@ResponseBody,而spring源码中@ResponseBody 的实现类发现其默认的编码是 iso-8859-1,而项目用的编码为utf-8,所以传中文会出现乱码。 这里我使用了注解来解决: @...

    解决ajax+php中文乱码的方法详解

    中文如果用表单提交的话,不会出现乱码,而用ajax提交就会出现乱码,这是什么原因呢?...当前台向后台传递数据的时候,用表单提交的话,前后台之间用“GB2312”编码交流,不会出现乱码;而用ajax提交的话,ajax在前

    Ajax的特性及乱码问题

    在讲解之前我先给大家说一下线性数据结构吧,我们可以把单线性数据结构当成一条线段,线段是有头有尾的大家总知道吧,单线程就是线段的头部没有前区,尾部没有后区,中间的每个元素前后都各有两个元素,少了一个元素...

    Ajax异步提交数据返回值的换行问题实例分析

    前面分析介绍了《Javascript基于AJAX回调函数传递参数》及《IE浏览器与FF浏览器关于Ajax传递参数值为中文时的区别》,学习了ajax回调函数传参与针对不同浏览器处理中文乱码问题的方法。这里就来分析一下ajax异步提交...

    解决了Ajax、MySQL 和 Zend Framework 的乱码问题

    问题: 在 Google Map 上用 Ajax 以 get 方式向服务器传递数据时,服务器端显示为 url 乱码, Zend Framework 向 MySQL 存储数据为乱码,但是提取出来又是正常中文字体, MySQL 中输入中文,显示在 PHP 网页上为乱码...

    jquery+ajax无刷新评论源码

    提交数据是action代表要执行的操作,id传递文章id,page是请求的分页页面,Math.round(Math.random()*10000) 防止页面被浏览器缓存而导致暂时无法刷新,如果出错显示错误信息 客户端用escape()函数编码含中文的字符...

    有关Ajax中get和post的使用问题

    乱码,当传递中文或者特殊字符的时候,前台显示出现乱码 解决办法:使用编码encodeURI(‘蜗牛’) 测试结果:通过使用Chrome测试,结果get的两种问题,都已经得到了解决 使用post遇到的问题: post方式,

    在Ajax中使用get和post所遇到的问题及解决办法

    乱码,当传递中文或者特殊字符的时候,前台显示出现乱码 解决办法:使用编码encodeURI(‘蜗牛’) 测试结果:通过使用Chrome测试,结果get的两种问题,都已经得到了解决 使用post遇到的问题:

    ASP中进行HTML数据及JS数据编码函数

    第一个函数把HTML中的数据转成HTML实体, 而HTML标签则自动不转, 这样无论到哪里都不会乱码, 可以在发送邮件时选择发送HTML格式的邮件. 第二个函数把JS数据同样是换成转义字符, 同样避开了JS关键词等字符的转换, ...

    SmartClient资料

    目 录 SmartClient 介绍 2 智能客户端技术 3 smartclient--练习 8 smartclient--listgrid 12 smartclient 整合 15 smartclient --registervalidate 22 smartclient 连接数据库 24 ...JS传递中文参数乱码 90

    保证JavaScript和Asp、Php等后端程序间传值编码统一

    在非英文字符集的页面上,如果使用Ajax方式进行数据...都先用escape进行编码,接收的一端用unescape进行解码即可保证Javascript和Asp数据传递过程中不会出现乱码! 在后端是PHP程序的情况下,保持前端Javascript和PH

    PHP入门到精通

    20.4解决数据库乱码问题 第3篇 高级应用 PHP网络开发(教学录像:42分33秒) 21.1电子邮件的原理 21.2系统的配置需求(SMTP和POP3服务器安装配置) 21.3应用PHP发送和接收电子邮件 PHP与XML技术(教学录像:31分17秒...

    PHP入门到精通02

    20.4解决数据库乱码问题 第3篇 高级应用 PHP网络开发(教学录像:42分33秒) 21.1电子邮件的原理 21.2系统的配置需求(SMTP和POP3服务器安装配置) 21.3应用PHP发送和接收电子邮件 PHP与XML技术(教学录像:31分17秒...

Global site tag (gtag.js) - Google Analytics