java learnging

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

          關于JSP讀寫MySQL數據庫的中文問題的測試
          測試代碼:
          1、 檢測WEB服務器端當前語言設置:
          String srcEncoding = java.lang.System.getProperty("file.encoding");
          out.print(srcEncoding);
          獲取JSP運行時所在的電腦(即WEB服務器)系統的file.encoding屬性可查出系統當前的語言設置。
          這一步獲得的語言設置值,在后面的測試記錄表中,稱為“語言檢測值”。
          2、 設置向客戶端輸出的字符集:
          <
          %@page contentType="text/html;charset=GB2312"%>(斜體部分可替換為BIG5或GBK,下同)
          這里的GB2312或BIG5或GBK,在后面的測試記錄表中,稱為“網頁字符集”。
          3、 將用戶的輸入轉換為目標字符集:
          JSP中:
          引用bean:<jsp:useBean id="IDIIL" scope="page" class="IDIIL.IDIILPublic"/>
          轉換輸入值:IDIIL.convertStr(request.getParameter("Name"),"ISO8859-1", "GB2312");
          Bean中:
          轉換函數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、 顯示中文內容:
          轉換字符集后顯示:<%=IDIIL.convertStr(rs.getString("Name"),"ISO8859-1","GB2312")%>
          不轉換字符集即顯示:<%=rs.getString("Name")%>
          ...測試總結:
          1、 最簡單通用的中文字符處理方案如下:
          對簡體中文系統:
          1) Windows2000或Redhat Linux7.0 WEB服務器端內核置為簡體中文,Redhat Linux7.0 WEB服務器還可置為英文;
          2) 網頁字符集設為簡體中文;
          3) 將輸入內容轉換為簡體中文存儲;
          4) 輸出時不作字符集轉換。
          對繁體中文系統,將上述簡體中文系統處理方案中的簡體中文替換為繁體中文即可。
          英文Windows2000服務器,可安裝(免費?)多語言包,即可使用簡體或繁體內核。
          注:目前只能將中文內容以POST方式提交,尚未解決以GET方式提交中文參數的問題。
          2、 GBK字符集對GB2312支持很好,但對Big5支持并不完全,因此,不建議使用GBK作為網頁字符集,而對簡體中文與繁體中文系統分別使用GB2312與Big5字符集
          ********************************************************************
           

          * 解決中文問題,ISO轉為GBK編碼,用于POST,GET方式取得數據
             
          *
           @param str 原始文本
             
          * @return
           轉碼后的文本
             
          */

            
          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;
            }


            
          /**
             * 解決中文問題,GBK轉ISO編碼,用于從數據庫中存入轉碼
             * @param str 原始文本
             * @return 轉換后文本
             
          */

            
          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;
            }


           

          下面是對上面所說的一個回帖:

          經過我的多次測試,只有umljsp(夜未央天未白)的方法能夠解決我這里發生的問題(也許每個人的開發環境有差異而引起解決方法的不同)。
          感謝所有提建議給我的朋友!非常感謝!
          通過測試,學習,再測試,再學習,我覺得自己有必要總結一下,有說的不對的地方請大家指正,另外某些專業性分析可能來自別的大蝦的貼子。

          1.運行環境:
          Win2000(經查,當前語言設置為GBK)
          Tomcat4.1.24
          Jdk1.4.1_02
          Mysql4.0.13(數據庫的字符集設為none)
          Mysql的Jdbc驅動mm.mysql-2.0.11-bin.jar

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

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

          方法2:
          1.連接數據庫 jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1"
          2.讀數據庫 執行iso2gb(String str)方法。具體參考此方法的實現
          3.寫數據庫 執行gb2iso(String str)方法。具體參考此方法的實現

          從上面看似乎方法2的形式更對稱一些,不過在以后免不了要多寫一個轉換編碼的函數,從頁面上看好像是不太舒服,不知大蝦們有沒有完美的解決方法?


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


          網站導航:
           
          主站蜘蛛池模板: 浦北县| 乌恰县| 平远县| 布拖县| 福建省| 钟山县| 文成县| 绥江县| 苍梧县| 东乡县| 杭锦后旗| 浪卡子县| 台山市| 丹东市| 永昌县| 九江县| 大名县| 贺州市| 辽阳县| 白朗县| 浦城县| 白水县| 蒙城县| 嘉黎县| 邮箱| 黎川县| 禹州市| 筠连县| 边坝县| 沽源县| 宿松县| 弋阳县| 六安市| 福州市| 尚志市| 景宁| 隆德县| 九龙县| 茌平县| 双柏县| 崇左市|