最近做一个小项目,碰到这个问题,很让人恼火。
用的是ajax+jsp+struts 的结构
js代码如下:
-
-
functioncreateXMLHttpRequest(){
-
if(window.XMLHttpRequest){
-
XMLHttpReq=newXMLHttpRequest();
- }
-
elseif(window.ActiveXObject){
-
try{
-
XMLHttpReq=newActiveXObject("Msxml2.XMLHTTP");
-
}catch(e){
-
try{
-
XMLHttpReq=newActiveXObject("Microsoft.XMLHTTP");
-
}catch(e){}
- }
- }
- }
-
-
functionsendDataRequest(){
- var url = "/resetPage.action?doing=buttonVal";
- createXMLHttpRequest();
-
XMLHttpReq.open("GET",url,true);
-
XMLHttpReq.setRequestHeader("Content-Type","text/html;charset=GBK");
-
XMLHttpReq.onreadystatechange=processDataResponse;
-
XMLHttpReq.send(null);
- }
-
-
functionprocessDataResponse(){
-
if(XMLHttpReq.readyState==4){
-
if(XMLHttpReq.status==200){
- updateButton();
-
}else{
-
alert("您所请求的页面有异常");
- }
- }
- }
-
functionupdateButton(){
-
varstr=XMLHttpReq.responseText;
- alert(str);
- }
java代码:
-
publicActionForwardbuttonVal ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
-
Stringstr="返回";
-
- PrintWriterout=response.getWriter();
-
response.setContentType("text/html;charset=GBK");
-
response.setHeader("Cache-Control","no-cache");
-
response.setCharacterEncoding("UTF-8");
-
System.out.println("===responseCharacterEncoding==="+response.getCharacterEncoding());
-
System.out.println("===response==ContentType==="+response.getContentType());
-
out.write(str);
-
out.close();
-
returnmapping.findForward(null);
- }
我的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的实现。
以下是一段参考代码:
-
<scriptlanguage="vbscript">
-
Functionstr2asc(strstr)
- str2asc=hex(asc(strstr))
-
EndFunction
-
Functionasc2str(ascasc)
- asc2str=chr(ascasc)
-
EndFunction
- </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<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<</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<</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<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传递中文参数时可能出现的乱码问题。关键是在发送端进行编码,在接收端进行相应的解码处理。同时,保持前后端以及数据库字符集的一致性也是很重要的。掌握了这些技巧后,开发者...
在IT行业中,Ajax(Asynchronous JavaScript ...通过理解和应用这些解决方案,开发者可以有效地避免和解决Ajax请求中的中文乱码问题,从而提高用户体验。记住,良好的编码习惯和对字符编码的理解是解决此类问题的关键。
在Web开发过程中,我们经常会遇到中文字符编码的问题,尤其是在前后端数据交互时,中文字符的乱码问题更是让人头疼。本文将深入探讨如何解决JavaScript(简称JS)在传递中文字符时出现的乱码问题,并提供具体的解决...
在IT领域,特别是Web开发中,字符编码的处理是一大挑战,尤其是在跨浏览器、跨平台的环境下,如在Ajax请求中遇到的FireFox与IE之间的乱码兼容问题。本文将深入探讨这一问题,并提供详细的解决方案。 ### Ajax与字符...
### AJAX技术使用XMLHttpRequest对象传递参数的中文乱码问题 #### 背景与问题概述 在使用AJAX技术进行前后端数据交互时,经常会出现中文字符编码的问题,尤其是在使用`XMLHttpRequest`对象发送请求的过程中。例如...
中文乱码问题在Web开发中是一个常见的挑战,特别是在使用Ajax进行异步数据提交时。通过正确使用URL编码或选择合适的参数传递方式,可以有效地解决这一问题。在实际应用中,开发者应当根据具体情况选择最合适的方法,...
然而,随着其应用的普及,开发者经常遇到一些常见问题,如数据乱码和页面间值传递。本篇文章将深入探讨如何解决这些问题。 一、解决Ajax乱码问题 Ajax发送和接收数据时,乱码问题主要出现在两个环节:发送请求时的...
在Web开发中,尤其是在使用Java与JSP技术栈进行开发时,经常会遇到的一个问题是:如何处理AJAX请求中的中文字符乱码问题。本篇文章将详细介绍如何通过前端编码处理、后端参数接收以及响应头设置等手段来有效解决这一...
在使用MyEclipse开发工具进行Web应用开发时,尤其是采用ExtJS框架结合Ajax技术进行前后端数据交互的过程中,可能会遇到一个常见的问题:即通过Ajax发送带有中文字符的数据时,后端接收到的数据出现乱码现象。...
在使用jQuery的Ajax功能进行数据交互时,可能会遇到中文参数乱码的问题。这通常是由于服务器与客户端之间...遵循以上步骤,可以有效地避免`jQuery Ajax`在传递中文参数时出现的乱码问题,保证数据的正常传输和解析。
在使用Ajax进行POST提交时,中文字符可能会遇到乱码问题,这是因为数据在传输过程中编码与解码不匹配导致的。Ajax以UTF-8编码发送数据,但服务器端可能使用了不同的字符集(如GB2312)来解析,这就产生了乱码。本文...
总的来说,解决Ajax乱码问题的关键在于理解字符编码的工作原理,确保数据在整个传输过程中的编码与解码一致性,以及正确设置服务器和客户端的编码设置。在实际应用中,还应考虑跨平台和跨浏览器的兼容性,以确保解决...
在Java Web开发中,Ajax技术常常用于实现页面的异步更新,但遇到中文乱码问题时,会导致数据传递出现错误。以下是一些解决Ajax中文乱码问题的方法: 1. **方法一:使用`encodeURI`编码** 当使用jQuery的Ajax方法...
总结来说,解决AJAX和JS传中文乱码问题的关键在于理解各种编码方式,以及在客户端和服务器之间正确地转换和传递数据。通过合理运用JavaScript的"escape"、"encodeURIComponent"等函数,并确保统一的编码标准,我们...
在使用jQuery的AJAX方法进行数据交互时,有时会遇到中文字符乱码的问题。这是因为浏览器、服务器和前端之间编码不一致导致的。本文将详细解释这个问题,并提供有效的解决方案。 首先,我们要理解AJAX(Asynchronous...
在本文中,我们将深入探讨如何解决Ajax加载JSON数据时出现的中文乱码问题。这个问题通常发生在前后端交互过程中,特别是当使用zTree等组件进行异步数据加载时。本文将通过一个具体的例子来阐述问题所在,并提供解决...
在使用JQuery的ajax方法调用返回JSON格式数据时,如果遇到中文字符显示乱码的情况,这是一个常见的问题,尤其在前后端交互过程中,因为编码格式不一致导致的字符显示错误。为了解决这个问题,我们需要确保前后端在...
总的来说,LoadRunner脚本中的乱码问题主要涉及字符编码的转换,通过`lr_convert_string_encoding`函数可以有效地解决这个问题,使脚本能够正确处理和传递中文数据。在实际测试过程中,我们需要对脚本进行细致的检查...
在Web开发中,Ajax(异步JavaScript和XML)技术被广泛应用于实现页面的无刷新更新,然而,与之相伴的一个常见问题是字符编码导致的乱码现象。本文将深入探讨Ajax乱码问题的成因及其解决方案。 首先,我们需要了解...