java learnging

          一塊探討JAVA的奧妙吧
          posts - 34, comments - 27, trackbacks - 0, articles - 22

          關(guān)于JSP讀寫(xiě)MySQL數(shù)據(jù)庫(kù)的中文問(wèn)題的測(cè)試
          測(cè)試代碼:
          1、 檢測(cè)WEB服務(wù)器端當(dāng)前語(yǔ)言設(shè)置:
          String srcEncoding = java.lang.System.getProperty("file.encoding");
          out.print(srcEncoding);
          獲取JSP運(yùn)行時(shí)所在的電腦(即WEB服務(wù)器)系統(tǒng)的file.encoding屬性可查出系統(tǒng)當(dāng)前的語(yǔ)言設(shè)置。
          這一步獲得的語(yǔ)言設(shè)置值,在后面的測(cè)試記錄表中,稱(chēng)為“語(yǔ)言檢測(cè)值”。
          2、 設(shè)置向客戶(hù)端輸出的字符集:
          <
          %@page contentType="text/html;charset=GB2312"%>(斜體部分可替換為BIG5或GBK,下同)
          這里的GB2312或BIG5或GBK,在后面的測(cè)試記錄表中,稱(chēng)為“網(wǎng)頁(yè)字符集”。
          3、 將用戶(hù)的輸入轉(zhuǎn)換為目標(biāo)字符集:
          JSP中:
          引用bean:<jsp:useBean id="IDIIL" scope="page" class="IDIIL.IDIILPublic"/>
          轉(zhuǎn)換輸入值:IDIIL.convertStr(request.getParameter("Name"),"ISO8859-1", "GB2312");
          Bean中:
          轉(zhuǎn)換函數(shù)convertStr代碼:

          public String convertStr(String str, String FromEncoding, String ToEncoding) throws UnsupportedEncodingException
            
          {
              String temp_src 
          =
           str;
              
          byte[] temp_mid =
           temp_src.getBytes(FromEncoding);
              String temp_dst 
          = new
           String(temp_mid, ToEncoding);
              
          return
           temp_dst;
            }

          4、 顯示中文內(nèi)容:
          轉(zhuǎn)換字符集后顯示:<%=IDIIL.convertStr(rs.getString("Name"),"ISO8859-1","GB2312")%>
          不轉(zhuǎn)換字符集即顯示:<%=rs.getString("Name")%>
          ...測(cè)試總結(jié):
          1、 最簡(jiǎn)單通用的中文字符處理方案如下:
          對(duì)簡(jiǎn)體中文系統(tǒng):
          1) Windows2000或Redhat Linux7.0 WEB服務(wù)器端內(nèi)核置為簡(jiǎn)體中文,Redhat Linux7.0 WEB服務(wù)器還可置為英文;
          2) 網(wǎng)頁(yè)字符集設(shè)為簡(jiǎn)體中文;
          3) 將輸入內(nèi)容轉(zhuǎn)換為簡(jiǎn)體中文存儲(chǔ);
          4) 輸出時(shí)不作字符集轉(zhuǎn)換。
          對(duì)繁體中文系統(tǒng),將上述簡(jiǎn)體中文系統(tǒng)處理方案中的簡(jiǎn)體中文替換為繁體中文即可。
          英文Windows2000服務(wù)器,可安裝(免費(fèi)?)多語(yǔ)言包,即可使用簡(jiǎn)體或繁體內(nèi)核。
          注:目前只能將中文內(nèi)容以POST方式提交,尚未解決以GET方式提交中文參數(shù)的問(wèn)題。
          2、 GBK字符集對(duì)GB2312支持很好,但對(duì)Big5支持并不完全,因此,不建議使用GBK作為網(wǎng)頁(yè)字符集,而對(duì)簡(jiǎn)體中文與繁體中文系統(tǒng)分別使用GB2312與Big5字符集
          ********************************************************************
           

          * 解決中文問(wèn)題,ISO轉(zhuǎn)為GBK編碼,用于POST,GET方式取得數(shù)據(jù)
             
          *
           @param str 原始文本
             
          * @return
           轉(zhuǎn)碼后的文本
             
          */

            
          public String iso2gb(String str) {
                
          if (str != null
          {
                    
          byte[] tmpbyte=null
          ;
                    
          try 
          {
                        tmpbyte
          =str.getBytes("ISO8859_1"
          );
                    }

                    
          catch (UnsupportedEncodingException e) {
                        System.
          out.println("Error: Method: dbconn.iso2gb :"+
          e.getMessage());
                    }

                    
          try {
                        str
          =new String(tmpbyte,"GBK"
          );
                    }

                    
          catch(UnsupportedEncodingException e) {
                        System.
          out.println("Error: Method: dbconn.gb2iso :"+
          e.getMessage());
                    }

                }

                
          return str;
            }


            
          /**
             * 解決中文問(wèn)題,GBK轉(zhuǎn)ISO編碼,用于從數(shù)據(jù)庫(kù)中存入轉(zhuǎn)碼
             * @param str 原始文本
             * @return 轉(zhuǎn)換后文本
             
          */

            
          public String gb2iso(String str) {
                
          if (str != null
          {
                    
          byte[] tmpbyte=null
          ;
                    
          try 
          {
                        tmpbyte
          =str.getBytes("GBK"
          );
                    }

                    
          catch(UnsupportedEncodingException e) {
                        System.
          out.println("Error: Method: dbconn.gb2iso :"+
          e.getMessage());
                    }

                    
          try {
                        str
          =new String(tmpbyte,"ISO8859_1"
          );
                    }

                    
          catch(UnsupportedEncodingException e) {
                        System.
          out.println("Error: Method: dbconn.gb2iso :"+
          e.getMessage());
                    }

                }

                
          return str;
            }


           

          下面是對(duì)上面所說(shuō)的一個(gè)回帖:

          經(jīng)過(guò)我的多次測(cè)試,只有umljsp(夜未央天未白)的方法能夠解決我這里發(fā)生的問(wèn)題(也許每個(gè)人的開(kāi)發(fā)環(huán)境有差異而引起解決方法的不同)。
          感謝所有提建議給我的朋友!非常感謝!
          通過(guò)測(cè)試,學(xué)習(xí),再測(cè)試,再學(xué)習(xí),我覺(jué)得自己有必要總結(jié)一下,有說(shuō)的不對(duì)的地方請(qǐng)大家指正,另外某些專(zhuān)業(yè)性分析可能來(lái)自別的大蝦的貼子。

          1.運(yùn)行環(huán)境:
          Win2000(經(jīng)查,當(dāng)前語(yǔ)言設(shè)置為GBK)
          Tomcat4.1.24
          Jdk1.4.1_02
          Mysql4.0.13(數(shù)據(jù)庫(kù)的字符集設(shè)為none)
          Mysql的Jdbc驅(qū)動(dòng)mm.mysql-2.0.11-bin.jar

          2.出現(xiàn)的問(wèn)題:讀寫(xiě)Mysql數(shù)據(jù)庫(kù)出現(xiàn)亂碼(或????問(wèn)號(hào))
          a.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,寫(xiě)入就正常了,但是中文輸  出就是亂碼了。

          3.分析
          我們所用到的數(shù)據(jù)庫(kù)讀寫(xiě)操作都是在Java環(huán)境下完成的,JAVA 語(yǔ)言默認(rèn)采用Unicode處理字符。
          Mysql和Java之間兼容的似乎很好,
          這就是為什么如果我們不對(duì)Jsp的輸出字符集做任何修改(如加上charset=gb2312),則Mysql數(shù)據(jù)庫(kù)的讀寫(xiě)都應(yīng)該沒(méi)問(wèn)題(如上述的a情況)的原因(只是讀出的中文輸出為亂碼)。
          這一點(diǎn)在Access2000上反而沒(méi)有任何問(wèn)題,看來(lái)是Access2000對(duì)GBK(gb2312)編碼的支持比較好。
          如果朋友們?cè)贛ysql的讀寫(xiě)數(shù)據(jù)庫(kù)中遇到問(wèn)題,可以試試如下方法:
          (以下方法參照umljsp(夜未央天未白)給出的iso2gb()和gb2iso()方法)
          方法1:
          1.連接數(shù)據(jù)庫(kù)   "jdbc:mysql://localhost/book?user=root"
          2.讀數(shù)據(jù)庫(kù) 不需要轉(zhuǎn)碼
          3.寫(xiě)數(shù)據(jù)庫(kù) 執(zhí)行g(shù)b2iso(String str)方法。具體參考此方法的實(shí)現(xiàn)

          方法2:
          1.連接數(shù)據(jù)庫(kù) jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1"
          2.讀數(shù)據(jù)庫(kù) 執(zhí)行iso2gb(String str)方法。具體參考此方法的實(shí)現(xiàn)
          3.寫(xiě)數(shù)據(jù)庫(kù) 執(zhí)行g(shù)b2iso(String str)方法。具體參考此方法的實(shí)現(xiàn)

          從上面看似乎方法2的形式更對(duì)稱(chēng)一些,不過(guò)在以后免不了要多寫(xiě)一個(gè)轉(zhuǎn)換編碼的函數(shù),從頁(yè)面上看好像是不太舒服,不知大蝦們有沒(méi)有完美的解決方法?


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 开平市| 晋城| 永丰县| 清河县| 邢台县| 宜宾市| 华蓥市| 沛县| 南昌市| 钟山县| 阿拉善盟| 勐海县| 长武县| 洪泽县| 肥东县| 马鞍山市| 陕西省| 南岸区| 嵩明县| 崇信县| 亚东县| 高台县| 祁阳县| 正镶白旗| 林周县| 西乡县| 施甸县| 长海县| 会东县| 公主岭市| 古浪县| 芷江| 安新县| 惠水县| 扎赉特旗| 玉山县| 田阳县| 鲁甸县| 改则县| 罗甸县| 台江县|