ajax亂碼解決彙總

ajax亂碼解決總結
第一,javascript沿用java的字符處理方式,內部是使用unicode來處理全部字符的,
第二,utf-8是每一個漢字(unicode字符)用3個字節來存儲。
第三,用utf-8來send數據是不會出現亂碼的,是後臺程序沒有正確解碼纔會出現亂碼。
第四,ajax發送數據的時候若是修改 Content-Type 爲 application/x-www-form-urlencoded",確定是用post方式,而「太大的數據每每會出錯」是用GET方式發送數據形成的。
第五,用vbscript寫的函數是用來把數據轉成gbk編碼(操做系統默認的編碼方式。若是在繁體系統上就是big5之類的編碼)的,而不是gb2312,二者的編碼字符數量相差3倍左右。
第六,用cookie來發送數據,一是很容易溢出,二是要不停的擦屁股,不然cookie裏面的數據在每一個http請求(包括圖片和腳本請求)中都會被髮送。三是併發幾個http請求的時候,沒有辦法指定那個cookie是要發送給那個http請求的。
------------------------
用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");


方法一 (這種方法不怎麼可靠)
 
向服務器發送請求,在服務器端加入:
  String string = request.getParmater("parmater");
string = new String(string.getBytes("ISO8859-1"),"GBK");
服務器向客戶端發送報文:
String static CONTENT_TYPE = "text/html;charset=GBK";
  response.SetContentType(CONTENT_TYPE);
 
 
方法二 (不推薦使用,URLDecoder.decode()與新瀏覽器不兼容)
Ajax POST 中文亂碼解決
 
看了好多篇文章,最終仍是看到一篇,解決了本身的問題.

ajaxpost.js
var myRequest; // Variable to hold request object
function mysubmit() ...{
if (window.XMLHttpRequest)
...{
myRequest = new XMLHttpRequest(); // Standards-compliant browsers
} else if (window.ActiveXObject)
...{
myRequest = new ActiveXObject("Msxml2.XMLHTTP"); // For IE
}

var post="name="+document.getElementById("postval").value;
post=encodeURI(post);
post=encodeURI(post); //最重要的部分,兩次調用encodeURI ,就是編碼兩次
myRequest.open("POST","servlet/Display",false);
//myRequest.setRequestHeader("contentLength",post.length);
myRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
myRequest.send(post);
var res=myRequest.responseText;//接收返回的數據
document.getElementById("display").innerHTML=res;
}

servlet

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException ...{

response.setContentType("text/html");
response.setCharacterEncoding("GBK");
PrintWriter out = response.getWriter();
String name=request.getParameter("name");
name=URLDecoder.decode(name,"utf8"); //post 傳遞的時候,必定是用utf8編碼的,url 本身能夠設定
System.out.println(name);
out.println(name);
out.flush();
out.close();
}

分析:當調用request.getParameter()函數時,會自動進行一次URI的解碼過程,調用時內置的解碼過程會致使亂碼出現。而URI 編碼兩次後,request.getParameter()函數獲得的是原信息URI編碼一次的內容。再用可控的解碼函數 java.net.URLDecoder.decode()就可解出原始的正確的信息。

方法三(還能夠)javascript

AJAX提交數據亂碼,返回數據亂碼的解決方案
隨着AJAX的流行,亂碼問題也開始困擾着許多剛開始使用它的程序員,幸虧我以前對JSP亂碼有過一點研究,在遇到AJAX後,並無給我帶來多大的困擾,在此將個人一些心得共享給你們。
萬變不離其宗,AJAX的亂碼問題天然跟編碼有關了,其實不少人跟我同樣想到了對文件編碼進行設置,而且在接數據時設置了requet的編碼,在返回的數據時設置了response的編碼一切都覺得會很順利,但是這一切都是徒勞無功的,討厭的亂碼再一次出如今你眼前。在你試了N多種方法,包括JS自身的escape,unescape方法後,你發現亂碼仍然猖狂地出如今屏幕上。
其實在試過這N多方法後,不少人都沒發現,解決的方法其實很簡單,並且其答案就在咱們以前處理的JSP亂碼之中。讓咱們先看一下AJAX的經典請求代碼

最後別忘了在返回數據時也設置上:
html

 

xmlhttp.open( "post" , url, async );
xmlhttp.setRequestHeader( "Content-Type", "text/html"
);
xmlhttp.send( params );


經過前面的說明,不知道你如今看出端倪了沒有。不知道是受了網上教程的影響仍是其它方面影響,setRequestHeader並是萬年不變的,也沒人想過去改它,而問題就正好出在這個地方。回想一個JSP頁面內容的編碼設置,其中有這麼一節: java

contentType="text/html; charset=UTF-8"


如今知道問題了吧,因此咱們要把第二句代碼改成: 程序員

xmlhttp.setRequestHeader( "Content-Type", "text/html;charset=UTF-8" );

 

response.setContentType( "text/xml" );
response.setCharacterEncoding( "UTF-8" );


是否是很簡單,一點都不麻煩呢?
若是要問爲何的話,其實咱們能夠把xmlhttp當作是一個臨時頁面,它由瀏覽器動態生成,主要做用是在後臺得到請求的數據(能夠當作是一個高級的iframe)。因此對於普通頁面設置的編碼,對它也要一樣設置。而在servlet中返回數據爲何要設置contentType和encoding其道理也是同樣的。衆所周知,jsp的最後形態就是servlet,而jsp頁首設置的那個內容其實也就是讓生成的servlet中生成這麼兩句話:
ajax

response.setContentType( "text/html" );
response.setCharacterEncoding( "UTF-8" );


而pageEncoding則是跟jvm說明了這個頁面的內容要使用什麼編碼保存(這跟以後生成的CLASS有關係)。因此在servlet設置response的編碼也是理所固然的了。瀏覽器

方法四(很保險,但代碼量很大,是個不錯的選擇.)服務器

在發送ajax請求以前,對參數escape()兩次( 例:name=escape(escape("張三")); ),而後再發送請求到服務器,服務器接收參數後,對參數unescape(),就能夠獲得正確的參數( 例:String name=unescape(request.getParameter("name")); ).cookie

附java版的unescape實現併發

public static String unescape (String src)
...{
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length());
int lastPos=0,pos=0;
char ch;
while (lastPos<src.length())
...{
pos = src.indexOf("%",lastPos);
if (pos == lastPos)
...{
if (src.charAt(pos+1)=='u')
...{
ch = (char)Integer.parseInt(src.substring(pos+2,pos+6),16);
tmp.append(ch);
lastPos = pos+6;
}
else
...{
ch = (char)Integer.parseInt(src.substring(pos+1,pos+3),16);
tmp.append(ch);
lastPos = pos+3;
}
}
else
...{
if (pos == -1)
...{
tmp.append(src.substring(lastPos));
lastPos=src.length();
}
else
...{
tmp.append(src.substring(lastPos,pos));
lastPos=pos;
}
}
}
return tmp.toString();
}

附:prototype ajax亂碼解決方法(已通過測試可行)
prototype對傳遞的參數都進行了編碼轉換工做,每一個傳遞值經過encodeURIComponent 進行了處理.編碼會被轉換成utf-8,在後臺獲取request時,應該統一使用request.setCharacterEncoding("UTF-8")對request設置編碼,而沒必要管頁面的編碼格式是什麼.若是使用post方法進行傳遞數據,則會自動執行:
request.setHeader('Content-type','application/x-www-form-urlencoded').確保傳遞數據編碼格式的正確.  app

相關文章
相關標籤/搜索