jquery ajax 中文亂碼解決了 happy~~~~~

總結,如果使用jquery 的$.get()方法獲取整個html頁面出現亂碼。那麼就將你的兩個頁面都加上   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 就ok了。

==============

http://phpxiaoxin.javaeye.com/blog/350544


jquery ajax 中文亂碼
結論:
jquery 1.3.2 ajax對編碼問題進行過部分(見後面補充1 )處理,解決方案以jsp爲例子:
ajax提交數據給jsp:ajax所在頁面無任何要求,jsp頁面需作兩方面處理。
1.<%@page contentType="application/json" pageEncoding="UTF-8"%>或<%@page contentType="application/json" pageEncoding="gb2312"%>
2.處理request.setCharacterEncoding("UTF-8")

詳細說明:
之所以會亂碼,原因很簡單,兩個人對話的時候,a說中文,b用英文接受,於是乎亂碼矣! 所以當出現亂碼搞清楚誰是a誰是b很重要,然後a說話的時候讓b知道應該用什麼語言接收,或者b以固定的方式接收,a用b接收的語言去說,這樣就萬事ok了。 所以下面分成兩部分去分析。一個是ajax單純獲取網頁信息的情況,一個是ajax單純往jsp等提交數據的情況,細的來說,這裏種情況有分兩種情況即post和get

ajax單純抓取網頁
a:請求的頁面,b:jquery ajax
這裏爲什麼a是請求的頁面,而b是jquery ajax呢?雖然是ajax向頁面要東西, 但是也可以理解爲a(頁面)要告訴ajax的內容是什麼,於是乎a說,我告訴你b(jquery ajax),我的內容是......並且內容的語言是gb2312的,你來接受吧。 於是b就根據他的編碼格式接收了a的內容,於是就沒亂碼了。看一下下面的表格

當前頁面編碼 js 請求頁面編碼 中文亂碼 解決方安/說明
gb2312 jquery ajax 獲取數據 gb2312 是 jsp:<%@page contentType="application/json" pageEncoding="gb2312"%>這裏用的json作測試,與text/html應該一樣
aps:Response.Charset="gb2312"(參照網絡未測試)
php:header("Content-Type:text/html; charset=gb2312");(參照網絡未測試)
html:未解決
gb2312 jquery ajax 獲取數據 utf-8 否  
utf-8 jquery ajax 獲取數據 utf-8 否  
utf-8 jquery ajax 獲取數據 gb2312 是 jsp:<%@page contentType="application/json" pageEncoding="gb2312"%>這裏用的json作測試,與text/html應該一樣
aps:Response.Charset="gb2312"(參照網絡未測試)
php:header("Content-Type:text/html; charset=gb2312");(參照網絡未測試)
html:未解決

首先說明,上面說的頁面編碼,是指文件字符編碼,而不是html裏面<meta>標籤內的charset=gb2312。根據以上數據顯示:ajax抓去網頁的時候,亂碼問題與當前頁面(ajax所在頁面)無關。
對於普通的html文件,亂碼不在於當前ajax所頁面而在於被抓去的頁面,如果被抓取的頁面爲gb2312就必須在文件頭聲明:pageEncoding="gb2312",

ajax單純提交數據到jsp頁面(post)
a:ajax, b:jsp

提 交數據的時候,jquery使用ajax方法,type: "post",data:{test:"hello你好"},jsp頁 面:pageEncoding="gb2312"/pageEncoding="UTF-8"都可以,根據具體返回的需要了。這裏建議大家debug的時 候看變量是否亂碼,因爲如果看jsp頁面,實際上又增加了一個編碼過程

ajax單純提交數據到jsp頁面(get)
這 裏需要注意,type: "get",的時候,由於涉及到url的編碼問題(詳細見下面的參考文章:深入淺出URL編碼), 所以需要在jsp接收數據的時候加下面這句:request.setCharacterEncoding("UTF-8"); 注意這裏一定要是UTF-8,而pageEncoding參數無論是UTF-8還是gb2312都可以。(因爲這個pageEncoding主要對請求後 返回的內容編碼起作用) 而對於java web開發,request.setCharacterEncoding("UTF-8")(注:根據“深入淺出URL編碼”這個設置應該針對post設 置而不是get,但在我測試的時候這樣設置的確在post的時候不需要而get的時候就可解決亂碼問題。)可以使用filter,或者struts2進行 全局解決, 根據網上的說法,好像還可以設置tomcate的配置解決這個問題。

當然有一些解決方法是局部進行轉碼和解碼,如js部分通過:escape或encodeURI方式將中文編碼,然後到了jsp/php/asp再通過一定方法實現對該數據的解碼,這種局部的方案,只能作臨時解決方案。

我以上所說可能有很多漏洞,甚至錯誤,但是我的確都在suse linux/firefox 3 默認utf8編碼 jdk 1.6.10 glassfish v2 環境下實驗過。 之所以寫出來,是給大家一個參考,或者說一個提示,如果大家這樣作,還是有亂碼,請變通嘗試其他方法,參考下面給出的參考文章列表。另外編碼問題還涉及到不同的瀏覽器不同的設置。如果搞明確了一些編碼設置,請過來批評,我好改正,謝謝:)

更正補充:

1.jquery ajax 對data參數有如下判斷處理:

if (s.data && s.processData && typeof s.data != "string")

s.data = jQuery.param(s.data);

就是說他檢查data參數是否是string,並且processData是否爲true,此參數默認爲true

jQuery.param(s.data)內部會作的處理就是:將數據進行encodeURIComponent(key/value)編碼後組裝。

所以當 data = {"name":"你好"},processData = true

服務器將接收到:name=%E4%BD%A0%E5%A5%BD

令我不解的是,當我用jersey做的rest web service通過post接收的時候接收到name=%E4%BD%A0%E5%A5%BD,就是說post什麼接收到了什麼,這個很正常。

而jsp設置了request.setCharacterEncoding("UTF-8");pageEncoding="UTF-8",就自動轉換成了name=您好

不知道這個轉換過程是誰做的?請明白的人幫忙解釋一下



本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/dust_bug/archive/2010/10/30/5976848.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章