Ajax中文問題徹底解決

2021-08-25 08:01:10 字數 2385 閱讀 9019

中文問題是和做web的程式設計師形影不離的, jsp頁面的中文問題,url傳參的中文問題,request取值的中文問題…….現在ajax日趨成熟了,它的中文問題也一樣浮出水面了。

其實萬變不離其宗,中文問題就是編碼問題,我們知道所有的字符集,不管是英文,操作符,標點符號,最基本的編碼方式就是iso-8859-1,中文的編碼方式現在最常用的就是gbk,gb2312,utf-8三種,這三種都是繼承自iso-8859-1,所以只要把握了底層最基本的編碼,不管是ajax還是struts,中文問題的解決都是一脈相承的。

好,那我們來看看乙個完整的ajax流程,一步步的來剖析它的中文問題及解決方法。

首先是頁面:jsp頁面的編碼方式決定了頁面上中文的顯示,這點應該都很清楚。要使jsp頁面中文不是亂碼

這樣就可以指定該頁面的中文編碼為utf-8了(用utf-8的原因是因為xml的編碼方式都是utf-8的,而ajax是和xml緊密相連的,jsp頁面及之後的ajax請求引數的提交,servlet中往客戶端寫輸出流都統一為utf-8,對於ajax的處理是相當有必要的)。

<%@ page contenttype="text/html;charset=utf-8"%>

然後就是ajax請求時傳遞的中文了,我們知道ajax請求雖是非同步的,但它也是乙個http請求,所以它也會有http header, url等這些引數,如果我們傳送ajax請求時需要傳遞中文引數,最好的辦法就是在客戶端就完成對http請求中中文資料的編碼,否則瀏覽器預設是用iso-8859-1編碼傳送http請求的。這裡說的中文資料報括兩部分:

一是http header中的url引數,比如

tomcat配置uri的方法如下(tomcat5.x以上必須設定該引數,否則它會採用一種非iso-8859-1的編碼方式,這樣即使服務端再request.setcharaterencoding()都沒法了,必定亂碼!):

這類傳參時的中文,這種中文編碼的解決辦法最好是讓應用伺服器來做,比如我們最常用的

二是http請求中body部分的中文,這就是表單中的資料了,這部分ajax的httprequest有專門的方法設定:如下所示:

這樣http body部分的中文就都已經編碼為utf-8了。,

好了,既然客戶端瀏覽器傳送ajax請求時請求的內容都已經用utf-8編碼了,那麼傳到服務端的資料就已經是編碼後的中文資料了,服務端的request就不需要通過request.setcharaterencodin()方式再設定編碼格式了。這點跟struts是最大的區別,我們通常看到的struts對編碼問題的解決是通過過濾器,即對所有傳送到後台服務端的請求都實現通過這個過濾器,在這個過濾器中設定request的編碼方式。實際上這兩種方式是殊途同歸的,ajax是在客戶端就做了編碼,傳送到服務端當然不需要設定了,而struts在客戶端submit的時候沒有做任何設定,那傳送到服務端的肯定是iso-8859-1的資料了,所以需要在過濾器中指定一下,這樣request 發現其中的資料有中文,就會對其進行編碼了。

接下來服務端完成了業務邏輯,要將結果返回給客戶端,那麼同樣的問題來了,還記得文中最開頭的時候我們在jsp頁面設定的嗎?那裡面指定的是utf-8編碼,那麼我們現在往jsp頁面寫輸出流的時候是不是也應該編碼成和頁面的中文編碼方式一致呢?答案是肯定的,我們的ajax返回資料時應該加上response的contenttype:

contenttype

!這樣向客戶端寫的資料中的中文也是utf-8編碼了,客戶端js指令碼獲取到request.respon***ml也好,

responsetext也好,裡面的資料都不會有亂碼了。 

至此ajax的中文問題已全部解決,從最初的jsp頁面看過來,中文就是乙個編碼方式的問題,出現亂碼的原因大部分是在錯誤的時間,錯誤的地點進行了編碼的操作,且編碼的型別一會兒gbk,一會兒gb2312,一會兒utf-8,當然資料會亂掉了。實際上如果熟悉了http協議,對編碼的問題有乙個清晰的了解,按照上述方法處理,中文是一點問題都沒有的。

Matplotlib 徹底解決中文亂碼問題解決方案

win10 和 mac都是雙擊開啟然後安裝即可。找到matplotlib字型資料夾,不知道matplotlib檔案在 的話,執行下面python import matplotlib matplotlib.matplotlib fname 輸出matplotlib包所在的配置檔案的路徑修改matplo...

MySql java 中文亂碼問題徹底解決 MAC

在mac finder 使用shift command g 輸入檔案的路徑 就可以查詢到 在mac下 修改 usr local mysql suppor files my default.cnf 將檔案內容更改 mysql default character set utf8 mysqld char...

徹底解決Oracle中文亂碼

服務端字符集 作業系統字符集 nls lang字符集 select from nls database parameters locale export american america.al32utf8 en us.utf 8 american america.zhs16gbk create ta...