struts,ajax出現亂碼的解決方案

來源:互聯網
上載者:User

亂碼問題好像跟我們中國程式員特別有緣,一直困擾著我們,從開始的JSP亂碼問題,STRUTS亂碼問題,到現在的AJAX亂碼問題,無一不是搞得許多程式員焦頭爛額的,整天罵XXX產品對中文支援不了,UTF-8無法使用中文啊什麼的,其實這裡面被罵的產品中其實99%以上是對中文支援非常好的,而出現亂碼的原因只是因為自身對國際化支援以及檔案編碼等資訊的認識不知造成的。要知道一個產品那麼流行,怎麼可能對中文支援不了呢,下面就開始一一幫大家解決這些問題。

1 、編碼
-- 想要解決好中文問題,對編碼肯定是不能一概不懂了,編碼是解決中文亂碼問題的根本。
編碼比較常用的有: UTF-8 , GBK , GB2312 , ISO-8859-1 ,除了 iso-8859-1 之外的其它三個編碼都能很好的支援中文,但它們都相容 ISO-8859-1 的編碼(就是說無論編碼怎麼改變,只要是ISO-8859-1中的字元,永遠不會出現亂碼)。

這四種編碼中, GB2312 是中國規定的漢字編碼,也可以說是簡體中文的字元集編碼 ; GBK 是 GB2312 的擴充 , 除了相容 GB2312 外,它還能顯示繁體中文,還有日文的假名 ; 而 UTF-8 雖然也支援中文,但卻與GB碼不相容(編碼值不同)。 UTF-8 使用的是可變長的UNICODE編碼,編碼可能是1位16進位(即 ISO-8859-1中的字元,其編碼也是相同的)也有可能是2位或3位的16進位。 UTF-8 的優點是:

1 、與CPU位元組順序無關,可以在不同平台之間交流。
2 、容錯能力高,任何一個位元組損壞後,最多隻會導致一個編碼碼位損失 , 不會鏈鎖錯誤
( 如 GB 碼錯一個位元組就會整行亂碼 ) ,所以在國際化處理中基本都是建議使用 UTF-8 作為編碼。

2、檔案的編碼
雖然說只要設定了正確的編碼就可以使字元正確顯示了,但如果忽略了檔案儲存時的編碼的話,那可是會讓你走進迷霧中的。

檔案編碼最常使用的有兩種:ANSI和UTF-8,光看名字估計你都可以猜到了,ANSI就是我們儲存檔案時使用的預設編碼,而UTF-8則需自己設定。對於編碼的改變,我使用的工具是NOTEPAD和ECLIPSE,NOTEPAD使用最簡單,只要開啟檔案後在另存新檔中選擇相應的編碼就行了,而且它對編碼的支援非常好;而在ECLIPSE中,只要稍微設定一下就行了,開啟喜好設定,然後選擇:常規->內容類型(ContentType),在右邊選中你想改變儲存編碼的檔案類型,然後在下方的預設編碼中改變其值,最後點擊更新(UPDATE)按鈕即可。

而在其它的編輯器中,預設儲存的內容都是GB2312或者GBK(NOTEPAD中對應ANSI).而根據前面所說的UTF-8和GBK,GB2312等的編碼值是不同的這一點,可以知道,如果檔案使用了UTF-8,那麼字元編碼就必須使用UTF-8,否則編碼值的不同就可能造成亂碼。而這也就是為什麼那麼多的人使用了UTF-8編碼後還會產生亂碼的根本原因。(JS和JSP都是這個道理)

3、JSP,STRUTS等的中文亂碼解決方案
其實解決的方法只有一個:

request.setCharacterEncoding(encoding);

方法只有一種,但處理方式就多種多樣了,初學者會在JSP頁面上直接使用,而有經驗的程式員會使用過濾器。而現在所要說的方法也是過濾器。這裡以統一使用UTF-8作為編碼作為例子說明。具體過程就不多說了,網上有很多教程。偷懶一點的,到TOMCAT中複製就行了。在TOMCAT的目錄下的\webapps\jsp-examples\WEB-INF\classes\filters\找到SetCharacterEncodingFilter.java 這個類,放到你的程式中並配置好映射路徑。配置好後基本上你的亂碼問題就解決了。但要映射路徑中需要注意的就是不能使用 '*'

< filter-mapping >
< filter-name > Set Character Encoding </ filter-name >
< servlet-name > * </ servlet-name >
</ filter-mapping >

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

< init-param >
< param-name > encoding </ param-name >
< param-value > UTF-8 </ param-value >
</ init-param >

當然,最重要的是要記得根據前面所說的方法,改變你所使用的編輯器儲存檔案的編碼要與使用的字元編碼一致。
而在JSP內容中,還是使用如網上教程所說的那種技倆,在所有頁面的頁首加入:

<% @ page language ="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

至此,相信JSP,ACTION都不太可能出現亂碼了。

4、資源檔的亂碼解決方案
資源檔誰都知道是國際化支援不可或缺的一部分,如果資源檔都出現亂碼了那還了得?其實資源檔的亂碼是很好解決的,其原因也是因為使用了UTF-8做為JSP編碼後,沒有相應地改變資源檔的檔案編碼造成的,所以只要對資源檔儲存的編碼進行更正後,亂碼問題也就解決了。當然,你的中文要使用 native2ascii 命令進行正確的轉換。

5、調用JS時,JS內容亂碼的解決方案。
其實JS的亂碼還是跟檔案的編碼有關係的,如果JS中有中文的話,那JS檔案儲存的編碼就必須跟調用此JS的頁面編碼相同,否則,你的所有中文都要從JSP頁面傳給JS才會顯示正常。可以看出對於調用JS出現的亂碼是最容易解決的(也是建立在前面的辛苦之下的)。

6、AJAX提交資料亂碼,返回資料亂碼的解決方案
隨著AJAX的流行,亂碼問題也開始困擾著許多剛開始使用它的程式員,幸好我之前對JSP亂碼有過一點研究,在遇到AJAX後,並沒有給我帶來多大的困擾,在此將我的一些心得共用給大家。

萬變不離其宗,AJAX的亂碼問題自然跟編碼有關了,其實很多人跟我一樣想到了對檔案編碼進行設定,並且在接資料時設定了requet的編碼,在返回的資料時設定了response的編碼一切都以為會很順利,可是這一切都是徒勞無功的,討厭的亂碼再一次出現在你眼前。在你試了N多種方法,包括JS自身的escape,unescape方法後,你發現亂碼仍然猖狂地出現在螢幕上。

其實在試過這N多方法後,很多人都沒發現,解決的方法其實很簡單,而且其答案就在我們之前處理的JSP亂碼之中。讓我們先看一下AJAX的經典請求代碼

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

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

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中產生這麼兩句話:response.setContentType( "text/html" );
response.setCharacterEncoding( "UTF-8" );

而pageEncoding則是跟jvm說明了這個頁面的內容要使用什麼編碼儲存(這跟之後產生的CLASS有關係)。所以在servlet設定response的編碼也是理所當然的了。

一口氣把自己一年以來遇到的亂碼問題和解決的方案寫出來了,希望對你有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.