Love Pisces

          It's not your aptitude but your attitude that determines your altitude!
          posts - 2, comments - 43, trackbacks - 0, articles - 9

          如何處理中文亂碼問題

          Posted on 2007-06-10 14:20 筱筱 閱讀(3126) 評論(43)  編輯  收藏 所屬分類: Java

                在Java編程中,經常會碰到漢字的處理及顯示問題,以不小心就會產生一大堆亂碼或者問號。造成這種問題的根本原因是Java中默認的編碼方式是Unicode,而中國人通常使用的文件和DB都是基于GB2312或BIG5等編碼,故會出現此問題。
                對于不同的問題,不同的JDK版本,不同的應用服務器(如Tomcat,Jboss,Weblogic),處理方法都會有一些微小的差異。在這里,主要針對Tomcat中JSP開發容易出現的中文亂碼問題進行討論,一般有以下幾種情況:

                1.JSP中輸出中文的亂碼問題

                所謂在JSP輸出中文,即直接在JSP中輸出中文,或者給變量賦中文值再輸出等,這種情況下的亂碼問題往往是因為沒有給JSP頁面制定顯示字符的編碼方式,解決問題如下:

                ·在JSP頁面頭部加上語句<%@ page contentType="text/html;charset=gbk"%>(在Servlet頁面中使用

          httpServletResponse.setContentType("text/html;charset=gbk")),最好同時在JSP頁面的head部分加上<meta http-equiv="Content-Type" content="text/html;charset=gbk">

                ·在每次要輸出中文的地方主動轉換編碼方式,比如要在頁面中輸入“中文”二字,就可以用以下方式:

          <%
                String str
          ="中文";
                
          byte[] tmpbyte=str.getBtyes("ISO-8859-1");
                str
          =new String(tmpbyte);
                out.print(str);
          %>


                2.獲取表單提交的數據時的中文亂碼問題

                在沒有加任何其他處理之前,用request.getParameter(panamName)獲取表單提交中的數據,且表單數據中含有中文時,返回的字符串會出現亂碼。出現這種問題的原因是Tomcat的J2EE實現對表單提交,即以POST方式提交的參數采用默認的ISO-8859-1來處理。
                比如,建立一個test.jsp,內容為:

          <%@ page contentTyp="text/html;charset=gbk"%>
          <%
                String str
          =request.getParameter("chStr");
                
          if(str==null) str="沒有輸入值";
          %>
          <html>
             
          <head>
                
          <title>中文Test</title>
                
          <meta http-equiv="Content-Type" content="text/html;charset=gbk">
                
          <meta http-equiv=param content=no-cache>
             
          </head>
             
          <body>你輸入的內容為:<%=str%><br>
                
          <form action="test.jsp" method="post">
                請輸入中文:
          <input type="text" name="chStr">
                
          <input type="submit" value="確定">
                
          </form>
             
          </body>
          </html>


                運行過后,在輸入框中輸入漢字“中文”,提交過后再顯示出來后就變成了一堆亂碼。解決此問題的辦法有兩個。一是不修改其他設置,只是在將表單中的中文數據取出來過后再轉換編碼,方法如語句String str=request.getParameter("chStr");String str=new String(sre.getByte("ISO-8859-1"),"gbk"),但這種方法只是從一個局部來考慮問題,如果這樣的地方太多,就不得不將這條語句重復寫很多次,在比較大的項目中,這是一種不太可行的方案。另一個方法就是讓對所有頁面的請求都通過一個Filter,將處理字符集設置為gbk。具體的做法如下(在Tomcat的webapps/servlet-examples目錄有一個完整的例子,也可以參考其中web.xml和SetCharacter EncodingFilter的配置):

                首先將%TOMCAT%/webapps/servlets-examples/Web-INF/classes/filters/目錄下的文件SetCharacterEncodingFilter.class拷貝到自己應用的/Web-INF/classes/com/util/filter目錄下;然后再在web.xml文件的<web-app>后面加上如下配置代碼:

          <filter>
               
          <filter-name>Set Character Encoding</filter-name>
               
          <filter-class>com.ccut.struts.SetCharacterEncodingFilter</filter-class>
               
          <init-param>
                  
          <param-name>encoding</param-name>
                  
          <param-value>gbk</param-value>
               
          </init-param>
          </filter>
          <filter-mapping>
               
          <filter-name>Set Character Encoding</filter-name>
               
          <url-pattern>/*<url-pattern>
             </filter-mapping>


                3.URL中的中文問題

                對于直接通過在URL中傳遞中文參數,如“http://localhost/a.jsp?str=中文”這樣的get請求,在服務端用request.getParameter("name")時返回的往往是亂碼。按以上的做法設置Filter沒有用,用request.setCharacterEncoding("gbk")的方式,仍然不管用。
                      例如,建立test2.jsp文件,內容為:

          <%@ page contentTyp="text/html;charset=gbk"%>
          <%
                String str
          =request.getParameter("chStr");
                
          if(str==null) str="沒有輸入值";
          %>
          <html>
                
          <head>
                   
          <title>中文Test</title>
                   
          <meta http-equiv="Content-Type" content="text/html;charset=gbk">
                   
          <meta http-equiv=param content=no-cache>
                
          </head>
                
          <body>你輸入的內容為:<%=str%><br>
                
          <form action="test.jsp" method="post">
                   
          <a href="test2.jsp?chStr=中文">點擊這里提交中文參數</a>
                
          </form>
                
          </body>
          </html>

                運行后,可見通過URL傳遞的中文參數取出來過后變成了亂碼,造成這種結果的原因是Tomcat中以get方式提交的請求對query-string處理時采用了和post方法不一樣的處理方式。
                解決這個問題的方法是打開Tomcat安裝目錄下的/conf/server.xml文件,找到Connector塊,往其中添加URIEncoding="gbk",添加過后完整的Connector塊代碼如下:

          <Connector port="8080"               
          maxThreads
          ="150" minSpareThreads="25" maxSpareThreads="75"
          enableLookups="false" redirectPort="8443" acceptCount="100"
             debug="0" connectionTimeout="20000" 
             disableUploadTimeout="true" 
             URIEncoding="gbk"
             />


                4.數據庫訪問時的亂碼問題

                在建立數據庫時,將數據庫中的所有表的編碼方式都設置為gbk,原因是JSP中也使用了gbk編碼,這樣統一的結果是可以減少很多不必要的編碼轉換問題。另外,在使用JDBC連接MySQL數據庫時,連接字符串寫成如下形式可以避免一些中文問題:

          jdbc://mysql://hostname:port/DBname?user=username&
          password=pwd&
          useUnicode
          =True&
          characterEncoding
          =gbk

                如果是以數據源的方式連接數據庫,在配置文件中使用:
          <parameter>
          <name>url</name>
          <value>
          jdbc://mysql://hostname:port/DBname?
          &useUnicode=True&characterEncoding=gbk
          </value>
          </parameter>

                但是,如果使用一個已經存在的數據庫,數據庫的編碼方式是ISO-8859-1,而Web應用中使用UTF-8,且數據庫中已經有很多重要信息,因此不能通過更改數據庫的編碼方式來解決問題。這個時候,在往數據庫中寫數據庫時,一定要在JDBC連接字符串中加入“useUnicode=True&characterEncoding=ISO-8859-1”,這樣可以順利的往數據庫中寫入正常的數據。但是,在將數據讀出數據庫時,亂碼又會出現,這個時候就應該在數據取出時對其轉碼,可以將轉碼功能寫為一個函數,具體實現如下:
          public String charConvert(String src){
                String result
          =null;
             
          if(src!=null){
             
          try{
                   result
          =new String(src.getBytes("ISO=8859-1"),"gbk");
                }
          catch(Exception e)
             
          {
                      result
          =null;
                      }

                }

                
          return result; 
          }
                于是,在從數據庫讀出數據過后調用charConvert(rs.getString("colName")),這樣就可以正常顯示數據庫中的中文數據了。

          Feedback

          # re: 如何處理中文亂碼問題[未登錄]  回復  更多評論   

          2007-09-20 13:12 by p
          謝謝!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-12 16:06 by sunway
          呵呵,你的親老公來過!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 08:48 by sunway
          在我想起你無法控制的時候,我就到這來發泄吧!希望在這里能夠越寫越少!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 08:50 by sunway
          反正你也看不到,看我能不能自己把它頂成大長帖,看看到底能有多長。

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 09:00 by sunway
          是不是被詛咒了?永遠都是到最后一步失敗?

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 09:32 by sunway
          我想回家

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 11:30 by sunway
          如果上天能把你還給我該多好,我感覺就像在演電影,你被下了魔法,使整個人改變了。

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 13:40 by sunway
          小兔子,呵呵,跑起來真可愛!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 13:49 by sunway
          在這里,心情就好一點,仿佛看到你一樣

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 13:51 by sunway
          老婆,真希望永遠可以這么稱呼,好久沒有看到溫柔的你了。懷念.......

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 14:19 by sunway
          女人的心好奇怪,過了一次火焰山,又溜達到北極了!能跑回赤道也行啊!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 14:52 by sunway
          好想和你說話,給你寫信,我怕更糟糕,更讓你煩,該怎么辦呢。

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 15:29 by sunway
          我還是鼓起勇氣寫了,不知道你會不會仔細的看完,體會我的真心!我最擔心的是你把這里也封了,那我一個靠岸的地方都沒有了!

          上帝啊!我也做了那面多好事,你也幫我一次!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 20:04 by sunway
          每個人都要為自己做的錯事付出代價,這話是真的,但是老天爺啊,你能給我這次機會嗎?我已經知道錯了,這次的懲罰對我來說太大了,我根本受不了啊,求您了,寬恕我這次吧!我愿意減壽10年,別讓她離開我。

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 20:07 by sunway
          離回去還有12天,對我來說那就是12年,時間快點過吧!不要讓我心愛的人選擇放棄!千萬不要啊!我會用我的全部來彌補我的過失,除了她。

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-21 21:36 by sunway
          你的每一句話,都在我心里回蕩,酸,疼,后悔,害怕。12天,千萬要經的住考驗呢,我除了擔心,一點力都用不上!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-22 09:07 by sunway
          寶貝,票很難買啊,我很早就定著了,今天就可以定1號的票了,正規途徑是買不到了,我在聯系黃牛,無論如何我都要回去和你團聚!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-22 11:45 by sunway
          寶貝,我吃飯去了,你也要照顧好自己,等回去了,我就會全身心的照顧你了,嘿嘿!還得找票,真難買啊!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-22 13:46 by sunway
          大盤跌的好厲害,人都說情場失意,賭場得意,看來我真的是受到了懲罰,雙失意。

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-22 16:52 by sunway
          不行了,腦袋不停的想,看著書,可腦袋里卻想著怎么能讓你回頭,就沒有更好的辦法了嗎?

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-22 21:54 by sunway
          原來變了心是這么的無情,我用100%的心寫了我所有的想法,還是無動于衷,難道再也找不回來了嗎?他是誰呀,我真是對他佩服的五體投地。到底發生過什么呢?短短幾次,我就變成了不值錢的塵土。

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-23 09:06 by sunway
          寶貝,早上好,票還沒定到,真著急啊!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-23 09:23 by sunway
          老婆,回頭吧!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-23 11:26 by sunway
          還沒買到票呢,寶貝,一定要保佑我順利回去,我一定要看到你!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-24 08:36 by sunway
          老婆,早上好,昨天很晚睡覺,今天一定起來很困吧!晚上進去寢室了嗎?你和樓下的說一下吧,有時候加班會很晚回去。

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-24 13:46 by sunway
          也不知道你會看到這里嗎?親愛的,時間快快過吧,早點回去看到你,再也不分開。

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-24 15:45 by sunway
          又想你想的不行了,一直在想做什么能讓你高興,能讓你回來呢,我現在想到了四件大事,我已經努力了兩件了,不過有一件太有難度了,而且需要很長時間,還可能辦不成,我苦苦的求我叔,終于被我感動愿意再幫我試試,另一件應該能辦好吧,希望在我回去之前能辦好,最后兩件只有我親自能辦了,也不知道老婆能不能給我這個機會了。老婆,我愛你!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-24 20:01 by sunway
          老婆,你每天都在干什么呢?我很想你,每天這個時候我都在給你寫信,都在想你,你能感覺到我的思念嗎?

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-25 08:44 by sunway
          老婆,早上好,我在這里就好像能和你說話一樣,記得想我啊!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-25 14:46 by sunway
          好高興啊,和你說話了,哈哈。吃蜂蜜都沒這么甜!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-25 16:35 by sunway
          親愛的,我的宿舍到期了,不讓我住,真鬧心,我現在是賴著不走啊,等熬過下周我就回去了,呵呵,保佑我一定要賴過去啊!嘎嘎!親親!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-25 18:47 by sunway
          老婆,我去吃飯了,你在學校一定要吃好飯呢,就怕你省錢,回去我都給老婆報,老婆一定要吃好啊!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-26 10:36 by sunway
          老婆,早上好,你今天在加班,真辛苦,我都不敢打擾你,等你累了一定要給我打電話放松一下啊!555我在這寫的你也看不到!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-26 12:11 by sunway
          老婆,你又不理我,回一個信息也行啊555,臭老婆,不知道想你呢!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-27 17:27 by sunway
          寶貝,很快就見到你了,希望經過這次,我們能合好如初,然后更加好!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-28 08:45 by sunway
          老婆,早上好!心情很低落,不想影響到你,其實是你影響到我!

          加油!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-28 13:31 by sunway
          老婆,我又來看你了,每天你都很忙,我會用心支持你的。不要很累,有些東西你要想開啊!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-28 16:53 by sunway
          記住這歷史性的一刻,老婆近期第一次和我說話就是在10分鐘前,說也很想我回去,但結果未卜啊,即使我最后失敗了,我也會愛護你的,老婆,今天真的很感謝你!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-29 09:07 by sunway
          寶貝,早上好!我來了,嘎嘎!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-01-30 08:44 by sunway
          親愛的,昨天開集團大會,就早上打了招呼,老婆贖罪,先給您請安了!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-02-17 23:40 by sunway
          老婆,今天的日子我又來了,希望我能為我以前的過失贖罪,我是罪人,我痛恨我自己,我也不會原諒我自己!

          # 感謝  回復  更多評論   

          2008-06-02 15:51 by 感謝
          十分的感謝!!!!!

          # re: 如何處理中文亂碼問題  回復  更多評論   

          2008-10-14 21:05 by 11
          垃圾老公

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


          網站導航:
           
          主站蜘蛛池模板: 临城县| 肇源县| 文安县| 增城市| 淮滨县| 浑源县| 张家港市| 弥渡县| 军事| 刚察县| 五寨县| 皮山县| 上虞市| 湖北省| 永吉县| 调兵山市| 海林市| 岳普湖县| 乐安县| 南开区| 江孜县| 宝山区| 吉木萨尔县| 五常市| 竹北市| 砀山县| 旬阳县| 高淳县| 固始县| 安龙县| 阿拉善左旗| 察哈| 阳原县| 尉氏县| 武穴市| 织金县| 青河县| 肃南| 高台县| 当雄县| 普定县|