struts,ajax出現(xiàn)亂碼的解決方法
亂碼問題好像跟我們中國程序員特別有緣,一直困擾著我們,從開始的JSP亂碼問題,STRUTS亂碼問題,到現(xiàn)在的AJAX亂碼問題,無一不是搞得許多程序員焦頭爛額的,整天罵XXX產(chǎn)品對中文支持不了,UTF-8無法使用中文啊什么的,其實(shí)這里面被罵的產(chǎn)品中其實(shí)99%以上是對中文支持非常好的,而出現(xiàn)亂碼的原因只是因?yàn)樽陨韺H化支持以及文件編碼等信息的認(rèn)識不知造成的。要知道一個產(chǎn)品那么流行,怎么可能對中文支持不了呢,下面就開始一一幫大家解決這些問題。
1 、編碼
-- 想要解決好中文問題,對編碼肯定是不能一概不懂了,編碼是解決中文亂碼問題的根本。
編碼比較常用的有: UTF-8 , GBK , GB2312 , ISO-8859-1 ,除了 iso-8859-1 之外的其它三個編碼都能很好的支持中文,但它們都兼容 ISO-8859-1 的編碼(就是說無論編碼怎么改變,只要是ISO-8859-1中的字符,永遠(yuǎn)不會出現(xiàn)亂碼)。
這四種編碼中, GB2312 是中國規(guī)定的漢字編碼,也可以說是簡體中文的字符集編碼 ; GBK 是 GB2312 的擴(kuò)展 , 除了兼容 GB2312 外,它還能顯示繁體中文,還有日文的假名 ; 而 UTF-8 雖然也支持中文,但卻與GB碼不兼容(編碼值不同)。 UTF-8 使用的是可變長的UNICODE編碼,編碼可能是1位16進(jìn)制(即 ISO-8859-1中的字符,其編碼也是相同的)也有可能是2位或3位的16進(jìn)制。 UTF-8 的優(yōu)點(diǎn)是:
1 、與CPU字節(jié)順序無關(guān),可以在不同平臺之間交流。
2 、容錯能力高,任何一個字節(jié)損壞后,最多只會導(dǎo)致一個編碼碼位損失 , 不會鏈鎖錯誤
( 如 GB 碼錯一個字節(jié)就會整行亂碼 ) ,所以在國際化處理中基本都是建議使用 UTF-8 作為編碼。
2、文件的編碼
雖然說只要設(shè)置了正確的編碼就可以使字符正確顯示了,但如果忽略了文件保存時的編碼的話,那可是會讓你走進(jìn)迷霧中的。
文件編碼最常使用的有兩種:ANSI和UTF-8,光看名字估計你都可以猜到了,ANSI就是我們保存文件時使用的默認(rèn)編碼,而UTF-8則需自己設(shè)置。對于編碼的改變,我使用的工具是NOTEPAD和ECLIPSE,NOTEPAD使用最簡單,只要打開文件后在另存為中選擇相應(yīng)的編碼就行了,而且它對編碼的支持非常好;而在ECLIPSE中,只要稍微設(shè)置一下就行了,打開首選項(xiàng),然后選擇:常規(guī)->內(nèi)容類型(ContentType),在右邊選中你想改變保存編碼的文件類型,然后在下方的缺省編碼中改變其值,最后點(diǎn)擊更新(UPDATE)按鈕即可。
而在其它的編輯器中,默認(rèn)保存的內(nèi)容都是GB2312或者GBK(NOTEPAD中對應(yīng)ANSI).而根據(jù)前面所說的UTF-8和GBK,GB2312等的編碼值是不同的這一點(diǎn),可以知道,如果文件使用了UTF-8,那么字符編碼就必須使用UTF-8,否則編碼值的不同就可能造成亂碼。而這也就是為什么那么多的人使用了UTF-8編碼后還會產(chǎn)生亂碼的根本原因。(JS和JSP都是這個道理)
3、JSP,STRUTS等的中文亂碼解決方案
其實(shí)解決的方法只有一個:

方法只有一種,但處理方式就多種多樣了,初學(xué)者會在JSP頁面上直接使用,而有經(jīng)驗(yàn)的程序員會使用過濾器。而現(xiàn)在所要說的方法也是過濾器。這里以統(tǒng)一使用UTF-8作為編碼作為例子說明。具體過程就不多說了,網(wǎng)上有很多教程。偷懶一點(diǎn)的,到TOMCAT中復(fù)制就行了。在TOMCAT的目錄下的\webapps\jsp-examples\WEB-INF\classes\filters\找到SetCharacterEncodingFilter.java 這個類,放到你的程序中并配置好映射路徑。配置好后基本上你的亂碼問題就解決了。但要映射路徑中需要注意的就是不能使用 '*'




像上面這樣配置的話(可能也是網(wǎng)上大多教程的做法,想當(dāng)年也是害苦了我),可能你只有JSP的亂碼解決了,要解決STRUTS的亂碼需要映射 *.do 或者 servletActionName。然后在初始化參數(shù)中設(shè)置encoding的值就行了。




當(dāng)然,最重要的是要記得根據(jù)前面所說的方法,改變你所使用的編輯器保存文件的編碼要與使用的字符編碼一致。
而在JSP內(nèi)容中,還是使用如網(wǎng)上教程所說的那種技倆,在所有頁面的頁首加入:

至此,相信JSP,ACTION都不太可能出現(xiàn)亂碼了。
4、資源文件的亂碼解決方案
資源文件誰都知道是國際化支持不可或缺的一部分,如果資源文件都出現(xiàn)亂碼了那還了得?其實(shí)資源文件的亂碼是很好解決的,其原因也是因?yàn)槭褂昧薝TF-8做為JSP編碼后,沒有相應(yīng)地改變資源文件的文件編碼造成的,所以只要對資源文件保存的編碼進(jìn)行更正后,亂碼問題也就解決了。當(dāng)然,你的中文要使用 native2ascii 命令進(jìn)行正確的轉(zhuǎn)換。
5、調(diào)用JS時,JS內(nèi)容亂碼的解決方案。
其實(shí)JS的亂碼還是跟文件的編碼有關(guān)系的,如果JS中有中文的話,那JS文件保存的編碼就必須跟調(diào)用此JS的頁面編碼相同,否則,你的所有中文都要從JSP頁面?zhèn)鹘oJS才會顯示正常??梢钥闯鰧τ谡{(diào)用JS出現(xiàn)的亂碼是最容易解決的(也是建立在前面的辛苦之下的)。
6、AJAX提交數(shù)據(jù)亂碼,返回數(shù)據(jù)亂碼的解決方案
隨著AJAX的流行,亂碼問題也開始困擾著許多剛開始使用它的程序員,幸好我之前對JSP亂碼有過一點(diǎn)研究,在遇到AJAX后,并沒有給我?guī)矶啻蟮睦_,在此將我的一些心得共享給大家。
萬變不離其宗,AJAX的亂碼問題自然跟編碼有關(guān)了,其實(shí)很多人跟我一樣想到了對文件編碼進(jìn)行設(shè)置,并且在接數(shù)據(jù)時設(shè)置了requet的編碼,在返回的數(shù)據(jù)時設(shè)置了response的編碼一切都以為會很順利,可是這一切都是徒勞無功的,討厭的亂碼再一次出現(xiàn)在你眼前。在你試了N多種方法,包括JS自身的escape,unescape方法后,你發(fā)現(xiàn)亂碼仍然猖狂地出現(xiàn)在屏幕上。
其實(shí)在試過這N多方法后,很多人都沒發(fā)現(xiàn),解決的方法其實(shí)很簡單,而且其答案就在我們之前處理的JSP亂碼之中。讓我們先看一下AJAX的經(jīng)典請求代碼



通過前面的說明,不知道你現(xiàn)在看出端倪了沒有。不知道是受了網(wǎng)上教程的影響還是其它方面影響,setRequestHeader并是萬年不變的,也沒人想過去改它,而問題就正好出在這個地方?;叵胍粋€JSP頁面內(nèi)容的編碼設(shè)置,其中有這么一節(jié):

現(xiàn)在知道問題了吧,所以我們要把第二句代碼改為:


最后別忘了在返回數(shù)據(jù)時也設(shè)置上:


是不是很簡單,一點(diǎn)都不麻煩呢?
如果要問為什么的話,其實(shí)我們可以把xmlhttp看成是一個臨時頁面,它由瀏覽器動態(tài)生成,主要作用是在后臺獲得請求的數(shù)據(jù)(可以看成是一個高級的iframe)。所以對于普通頁面設(shè)置的編碼,對它也要同樣設(shè)置。而在servlet中返回數(shù)據(jù)為什么要設(shè)置contentType和encoding其道理也是一樣的。眾所周知,jsp的最后形態(tài)就是servlet,而jsp頁首設(shè)置的那個內(nèi)容其實(shí)也就是讓生成的servlet中生成這么兩句話:


而pageEncoding則是跟jvm說明了這個頁面的內(nèi)容要使用什么編碼保存(這跟之后生成的CLASS有關(guān)系)。所以在servlet設(shè)置response的編碼也是理所當(dāng)然的了。
一口氣把自己一年以來遇到的亂碼問題和解決的方案寫出來了,希望對你有所幫助。
- 通過Ajax兩種方式講解Struts2接收數(shù)組表單的方法
- JQuery+Ajax+Struts2+Hibernate框架整合實(shí)現(xiàn)完整的登錄注冊
- struts2+jquery實(shí)現(xiàn)ajax登陸實(shí)例詳解
- STRUTS+AJAX+JSP 請求到后臺亂碼問題解決方法
- ajax交互Struts2的action(客戶端/服務(wù)器端)
- Jquery、Ajax、Struts2完成定時刷新的方法
- ajax+json+Struts2實(shí)現(xiàn)list傳遞實(shí)例講解
- ajax struts2 下拉框賦值(適合所有)
- Java的Struts框架中Action的編寫與攔截器的使用方法
- 關(guān)于Struts2文件上傳與自定義攔截器
- java Struts2 在攔截器里的跳轉(zhuǎn)問題
- 在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對其優(yōu)化
相關(guān)文章
GX::Transcoder v3.20.51.3687 - 音頻視頻文件轉(zhuǎn)換全能王 下載
GX::Transcoder v3.20.51.3687 - 音頻視頻文件轉(zhuǎn)換全能王 下載...2007-05-05價值七萬元的視頻轉(zhuǎn)換軟件--Canopus ProCoder V2.04.02 漢化破解版
價值七萬元的視頻轉(zhuǎn)換軟件--Canopus ProCoder V2.04.02 漢化破解版...2007-01-01WinZIP 11.0 正式版(Build 7347)發(fā)布!下載
WinZIP 11.0 正式版(Build 7347)發(fā)布!下載...2007-03-03支持64位的蘋果操作系統(tǒng)X 10.5 Leopard 提供BT下載了
支持64位的蘋果操作系統(tǒng)X 10.5 Leopard 提供BT下載了...2007-10-10AVG Anti-Spyware 7.5.0.50 加強(qiáng)版 下載
AVG Anti-Spyware 7.5.0.50 加強(qiáng)版 下載...2007-05-05用來記筆記的軟件 EverNote 2.2.1.386提供下載
2008-01-01服務(wù)器系統(tǒng)備份工具雨林木風(fēng) OneKey Ghost Y2.0 測試版
一款設(shè)計專業(yè)、操作簡便,在 Windows 下對任意分區(qū)進(jìn)行一鍵備份/恢復(fù)綠色程序。 支持多硬盤、混合硬盤(IDE/SATA/SCSI)、混合分區(qū)(FAT32/NTFS)、未指派盤符分區(qū)、盤符錯亂、隱藏分區(qū)以及交錯存在非 Windows 分區(qū)。 支持多系統(tǒng),并且系統(tǒng)不在第一個硬盤第一個分區(qū)。2008-03-03