<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    關(guān)注技術(shù),關(guān)注生活

    任何事情只要開始去做,永遠(yuǎn)不會太遲。
    posts - 5, comments - 23, trackbacks - 0, articles - 18
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    [原創(chuàng)]struts,ajax亂碼解決方案

    Posted on 2006-12-09 21:24 errorfun 閱讀(3857) 評論(12)  編輯  收藏 所屬分類: JavaAjax

    亂碼問題好像跟我們中國程序員特別有緣,一直困擾著我們,從開始的JSP亂碼問題,STRUTS亂碼問題,到現(xiàn)在的AJAX亂碼問題,無一不是搞得許多程序員焦頭爛額的,整天罵XXX產(chǎn)品對中文支持不了,UTF-8無法使用中文啊什么的,其實這里面被罵的產(chǎn)品中其實99%以上是對中文支持非常好的,而出現(xiàn)亂碼的原因只是因為自身對國際化支持以及文件編碼等信息的認(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)點是: 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è)置一下就行了,打開首選項,然后選擇:常規(guī)->內(nèi)容類型(ContentType),在右邊選中你想改變保存編碼的文件類型,然后在下方的缺省編碼中改變其值,最后點擊更新(UPDATE)按鈕即可。



    而在其它的編輯器中,默認(rèn)保存的內(nèi)容都是GB2312或者GBK(NOTEPAD中對應(yīng)ANSI).而根據(jù)前面所說的UTF-8和GBK,GB2312等的編碼值是不同的這一點,可以知道,如果文件使用了UTF-8,那么字符編碼就必須使用UTF-8,否則編碼值的不同就可能造成亂碼。而這也就是為什么那么多的人使用了UTF-8編碼后還會產(chǎn)生亂碼的根本原因。(JS和JSP都是這個道理)

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

    ?request.setCharacterEncoding(encoding);

    ???方法只有一種,但處理方式就多種多樣了,初學(xué)者會在JSP頁面上直接使用,而有經(jīng)驗的程序員會使用過濾器。而現(xiàn)在所要說的方法也是過濾器。這里以統(tǒng)一使用UTF-8作為編碼作為例子說明。具體過程就不多說了,網(wǎng)上有很多教程。偷懶一點的,到TOMCAT中復(fù)制就行了。在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 >

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

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

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

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

    至此,相信JSP,ACTION都不太可能出現(xiàn)亂碼了。

    4、資源文件的亂碼解決方案
    ????? 資源文件誰都知道是國際化支持不可或缺的一部分,如果資源文件都出現(xiàn)亂碼了那還了得?其實資源文件的亂碼是很好解決的,其原因也是因為使用了UTF-8做為JSP編碼后,沒有相應(yīng)地改變資源文件的文件編碼造成的,所以只要對資源文件保存的編碼進(jìn)行更正后,亂碼問題也就解決了。當(dāng)然,你的中文要使用 native2ascii 命令進(jìn)行正確的轉(zhuǎn)換。

    5、調(diào)用JS時,JS內(nèi)容亂碼的解決方案。
    ???? 其實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亂碼有過一點研究,在遇到AJAX后,并沒有給我?guī)矶啻蟮睦_,在此將我的一些心得共享給大家。
    ???? 萬變不離其宗,AJAX的亂碼問題自然跟編碼有關(guān)了,其實很多人跟我一樣想到了對文件編碼進(jìn)行設(shè)置,并且在接數(shù)據(jù)時設(shè)置了requet的編碼,在返回的數(shù)據(jù)時設(shè)置了response的編碼一切都以為會很順利,可是這一切都是徒勞無功的,討厭的亂碼再一次出現(xiàn)在你眼前。在你試了N多種方法,包括JS自身的escape,unescape方法后,你發(fā)現(xiàn)亂碼仍然猖狂地出現(xiàn)在屏幕上。
    ??? 其實在試過這N多方法后,很多人都沒發(fā)現(xiàn),解決的方法其實很簡單,而且其答案就在我們之前處理的JSP亂碼之中。讓我們先看一下AJAX的經(jīng)典請求代碼

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

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

    現(xiàn)在知道問題了吧,所以我們要把第二句代碼改為:
    xmlhttp.setRequestHeader(?"Content-Type",?"text/html;charset=UTF-8"?);

    最后別忘了在返回數(shù)據(jù)時也設(shè)置上:
    response.setContentType(?"text/xml"?);
    response.setCharacterEncoding(?
    "UTF-8"?);

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

    而pageEncoding則是跟jvm說明了這個頁面的內(nèi)容要使用什么編碼保存(這跟之后生成的CLASS有關(guān)系)。所以在servlet設(shè)置response的編碼也是理所當(dāng)然的了。

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

    評論

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2006-12-10 02:40 by jackstudio
    小弟將樓主的文章轉(zhuǎn)到了自己的Blog了,
    希望樓主支持。

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2006-12-10 12:33 by errorfun
    支持

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2006-12-11 11:02 by Zou Ang[匿名]
    很好的文章,轉(zhuǎn)到我的Blog上做珍藏,樓主如果不同意,麻煩告知我,馬上刪除

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2006-12-11 12:12 by errorfun
    沒關(guān)系的,寫出來的東西就是要讓大家共同學(xué)習(xí)的,如果不讓轉(zhuǎn)載,那就沒意義了

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2006-12-11 19:26 by BeanSoft
    樓主真是個好人!!!

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2006-12-21 16:42 by javaMan[匿名]
    樓主真是個不錯的人!!
    大力支持!!!!!謝謝你無私的精神!!

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2006-12-24 15:53 by BeanSoft
    ajax 的客戶端提交表單數(shù)據(jù)的時候用 encodeURIComponent 比較保險. 還有就是建議統(tǒng)一使用 UTF-8 編碼. 近期將發(fā)一份關(guān)于前一陣子做應(yīng)用的一個例子.

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2007-07-06 12:20 by CAnca
    俺轉(zhuǎn)到自己博客啦!!如果樓主不同意,俺立即刪除啦!

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2008-10-12 10:54 by sitinspring
    有些亂碼沒那么簡單,比如url中嵌入中文再取出最后一個字會變成問號。

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2008-10-15 00:05 by errorfun
    @sitinspring

    你說的這個還是編碼的問題,中文取出后變成問號就是和我說的第6點一樣的問題,一般情況下有可能出現(xiàn)的就是你的URL中文用的是UTF-8但提交時可能把它當(dāng)成GBK了,或者是GBK當(dāng)成UTF-8了,這時候會有部分不出出現(xiàn)錯誤,但有一些會出現(xiàn)?或方框,這是因為UTF-8中的碼表跟GBK的不是一樣的,但有部分一樣。而出現(xiàn)?大多數(shù)情況下是轉(zhuǎn)成ISO-8859-1出問題,出方框是轉(zhuǎn)成GBK出問題,這部分因為要說起來會很麻煩,所以我也沒在這里面提出來,但只要你在所有地方設(shè)置好了編碼,一般就不會出現(xiàn)這種情況了。

    還有你這種情況的出現(xiàn),有時是你在TOMCAT里沒設(shè)置好編碼造成的,這個配置一下就行了的。

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2008-10-15 19:23 by sheng
    樓主ajax部分的亂碼解決方法有沒有測試過的?
    發(fā)現(xiàn)有以下幾個問題:
    1.很多書上說到用post提交時必須是大寫的"POST";
    2.與POST相對應(yīng)的contentType必須是"application/x-www-form-urlencoded",否則提交不了數(shù)據(jù),我做過測試的確是這樣;
    3.只在服務(wù)端和客戶端設(shè)置相應(yīng)header還是解決不了亂碼問題,還是得顯式進(jìn)行轉(zhuǎn)換。如下:
    String para = request.getParameter("paraName");
    byte[] tmp = para.getBytes("ISO8859-1");
    para = new String(tmp,"GBK");
    //如果是form表單直接提交的數(shù)據(jù)就不須這樣轉(zhuǎn)換也不會亂碼,
    //但如果是用url直接提交的或以ajax提交的參數(shù)都必須進(jìn)行以上
    //顯式轉(zhuǎn)換。 不知樓主有沒有試過這種情況?

    # re: [原創(chuàng)]struts,ajax亂碼解決方案  回復(fù)  更多評論   

    2008-10-15 19:40 by sheng
    我正在做一個項目,用到struts+ajax.
    用ajax提交的表單數(shù)據(jù)到ActionForm中,中文的都變成亂碼。
    雖然可以用顯式的一個參數(shù)一個參數(shù)進(jìn)行轉(zhuǎn)換,但那已失去了ActionFrom自動
    封裝的意義。
    請樓主幫忙想想辦法!!!

    說明:
    request.setCharacterEncoding("GBK");
    contentType="text/html; charset=gb2312"
    及SetCharacterEncodingFilter.java
    等文件頭設(shè)置的東東都已用上了。而且用表單提交不會出亂碼也不用顯式轉(zhuǎn)碼。只有ajax中才會亂碼。ajax中已設(shè)置了文件頭,如下:
    POST:requestObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=GBK");

    GET:requestObj.setRequestHeader("Content-Type", "text/html;charset=GBK");

    用GET方法提交時需顯式轉(zhuǎn)換字符集,用POST提交時顯式轉(zhuǎn)換字符集也沒用。

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲最大av无码网址| 亚洲香蕉久久一区二区三区四区| 久久久国产精品福利免费| 亚洲欧洲精品一区二区三区| 性做久久久久免费观看| 三年片免费高清版| 亚洲综合久久一本伊伊区| 免费一级毛片正在播放| 一级毛片免费毛片一级毛片免费| 欧洲亚洲国产精华液| 亚洲成年轻人电影网站www| 国产色爽免费视频| 久久国产精品一区免费下载| 亚洲色成人网站WWW永久四虎 | 亚洲欧洲日产国码无码网站| 亚洲免费电影网站| 一级毛片成人免费看a| 亚洲的天堂av无码| 亚洲综合日韩久久成人AV| 久久综合AV免费观看| A片在线免费观看| 黄色毛片免费网站| 亚洲日本久久久午夜精品| 亚洲精品乱码久久久久久自慰| 在线免费观看一级片| 最近中文字幕无免费| 一区二区三区免费在线观看| 亚洲av无码片区一区二区三区| 在线观看亚洲成人| 国产成人综合久久精品免费 | 国产精品免费看久久久久| 99久久国产免费中文无字幕| 无码日韩人妻AV一区免费l | 无码不卡亚洲成?人片| 97在线观免费视频观看| 今天免费中文字幕视频| 一个人看的hd免费视频| 狼人大香伊蕉国产WWW亚洲| 亚洲H在线播放在线观看H| 久久亚洲私人国产精品| 亚洲一区精品无码|