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

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

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

    posts - 32, comments - 153, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    [轉帖]struts,ajax亂碼解決方案

    Posted on 2006-12-11 11:04 Zou Ang 閱讀(3302) 評論(11)  編輯  收藏 所屬分類:

    原帖地址:
    http://m.tkk7.com/errorfun/archive/2006/12/09/86584.html
    亂碼問題好像跟我們中國程序員特別有緣,一直困擾著我們,從開始的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的編碼也是理所當然的了。

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

    評論

    # re: [轉帖]struts,ajax亂碼解決方案   回復  更多評論   

    2007-03-27 20:33 by ralph
    很好,謝謝

    # re: [轉帖]struts,ajax亂碼解決方案   回復  更多評論   

    2007-03-30 17:52 by 1
    shuo de hao!

    # re: [轉帖]struts,ajax亂碼解決方案 [未登錄]  回復  更多評論   

    2007-05-08 16:36 by david
    講的太好了!!!

    # re: [轉帖]struts,ajax亂碼解決方案   回復  更多評論   

    2007-05-23 10:33 by kedou
    非常好~感謝

    # re: [轉帖]struts,ajax亂碼解決方案   回復  更多評論   

    2007-07-11 15:59 by 路過
    ajaxObj.open('POST', url, false);
    ajaxObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

    樓主,我用的是這個代碼,一樣沒有問題,我也用了filter,
    據說xmlHttp缺省用UTF-8編碼,使這樣嗎?

    我還有一個問題沒有解決,就是通過ajax post上去的“加號”變成了“空格”,始終沒有解決,樓主有沒有遇到此問題??

    # re: [轉帖]struts,ajax亂碼解決方案   回復  更多評論   

    2007-08-10 14:12 by 06年畢業
    呵呵~~找了很多頁面。終于在你這找到答案啊。謝謝了。我轉載回去,希望不要介意

    # re: [轉帖]struts,ajax亂碼解決方案 [未登錄]  回復  更多評論   

    2007-11-02 17:09 by Joe
    通過ajax post上去的“加號”變成了“空格”,始終沒有解決,樓主有沒有遇到此問題??

    這個問題我也始終沒有解決
    不知道樓主曾經遇到過這種問題沒
    有人解決過么?

    # re: [轉帖]struts,ajax亂碼解決方案 [未登錄]  回復  更多評論   

    2008-04-22 00:53 by Bob
    相當的感謝,寫得實在太好了。

    # re: [轉帖]struts,ajax亂碼解決方案   回復  更多評論   

    2008-08-25 18:06 by WKL
    一天沒搞定的內容在看了作者的文章后,立馬解決,非常感謝。

    # re: [轉帖]struts,ajax亂碼解決方案   回復  更多評論   

    2008-10-15 18:47 by sheng
    樓主,你那ajax的亂碼有沒有測試過?你的以下的代碼有問題

    xmlhttp.open( "post", url, async );
    //1.post必須為大寫POST,不信你們試試
    xmlhttp.setRequestHeader( "Content-Type", "text/html" );
    //2.以POST方法提交的Content-Type必須是
    // “application/x-www-form-urlencoded”,否則參數提交不了。
    xmlhttp.send( params );

    //3.使用GET和POST提交的亂碼解決方法是不同的,GET可用通用的方法解
    //決,但POST就不行。目前正在尋找POST的解決方法。

    # re: [轉帖]struts,ajax亂碼解決方案   回復  更多評論   

    2009-03-15 09:21 by 007
    http://blog.csdn.net/javagenuie

    看看我的方案,是不是完美?
    主站蜘蛛池模板: 1000部拍拍拍18勿入免费视频软件| 久久精品国产亚洲AV电影网| 特级毛片在线大全免费播放| 好吊妞在线成人免费| 亚洲综合无码一区二区痴汉| 女人18一级毛片免费观看| 亚洲一区二区三区写真| 女人18毛片免费观看| 黄色网址在线免费观看| 亚洲一本大道无码av天堂| 一级毛片大全免费播放下载| 337p日本欧洲亚洲大胆裸体艺术| 久久av免费天堂小草播放| 亚洲成a人片在线观看日本| 永久免费视频网站在线观看| 亚洲精品伊人久久久久| 韩国欧洲一级毛片免费| 一边摸一边爽一边叫床免费视频| 中文字幕在线亚洲精品| 69精品免费视频| 亚洲无码一区二区三区| 亚洲福利精品电影在线观看| 久久99毛片免费观看不卡| 亚洲国产综合人成综合网站00| 香蕉高清免费永久在线视频 | 成年女人喷潮毛片免费播放| 亚洲狠狠婷婷综合久久| 国产福利电影一区二区三区,亚洲国模精品一区 | 日本亚洲视频在线 | 亚洲国产午夜精品理论片在线播放| 国产精品免费看香蕉| 国产在线观看xxxx免费| 91亚洲精品自在在线观看| 国产伦一区二区三区免费| 99在线热播精品免费99热| 亚洲免费视频观看| 亚洲国模精品一区| 国产成人精品免费视频大| 特级aaaaaaaaa毛片免费视频| 亚洲国产美国国产综合一区二区| 免费观看男人免费桶女人视频 |