徹底解決程式亂碼問題

gudesheng發表於2008-01-03

        由於程式程式設計過程中存在眾多的編碼集,而這些編碼集又各自有自己的方法來表示一箇中文字元。由此,造成我們的程式顯示中文的時候亂碼。最多的是本來是中文,但結果顯示為問號?

       這篇文章從我碰到過的問題來從根本上解決亂碼的問題,反正我用這個方法是百戰百勝^_^嘎嘎

       我們知道,在我們的中文系統中使用的是“GBK”編碼集。

       也就是說,比如我們從本地系統中讀入一個包含中文內容的.txt檔案,那麼我們從這個磁碟空間所獲得是流檔案是個經過“GBK”的。

      但是,假如我們的JVM預設的編碼集是“ISO-8859-1”,那麼這個流檔案經過我們的JVM編碼就變成一個Unicode的字元或者字串。

       是不是說的很抽象。

       下面我具體解釋一下。

       什麼是編碼?編碼說白了就是從位元組到字元(Unicode)的過程,因為我們的字元或字串在JVM中是用Unicode表示的,也就是說編碼實質上是獲取一個Unicode碼的過程。

      我再來解釋一下解碼?解碼就是把JVM裡的Unicode碼轉換成我們本地字符集所表示的位元組流。

     如果在程式設計過程中,JVM預設的字符集和我們的中文系統,或者資料庫檔案等採用的字符集不一樣。

    這樣的情況下,如果我們僅僅是編碼,而不去解碼。也就說把本來用“GBK”的位元組流採用“ISO-8859-1”轉換成字元或字串,這個時候就產生了亂碼。

    當然,現在JVM和中文系統預設的編碼集已經一樣了,所以產生這種情況的很少。但是在讀取資料庫檔案的時候依然會經常碰到這種情況。所以,我一貫主張從本質上來了解一個知識,然後才能融會貫通,應用自如,這是高手的境界,當然,我不能算高手^_^哈哈

      好了,如果你現在還不明白編碼解碼怎麼回事?以及亂碼產生的原因。我想你可以去撞牆了。

     那麼,編碼的時候兩個系統的字符集不一致,該怎麼辦呢?怎麼樣把他們變成一致?

     如果有可以直接改變系統字符集的方法,那當然是最好的了。比如在JVM裡

   Properties pps = System.getProperties();

   pps.put("file.encoding","GBK");

   這樣,就把JVM的預設字符集改變成“GBK”了。

    那麼,如果沒有改怎麼辦?

  什麼?沒辦法?那是不可能滴,沒有程式解決不了的問題,這也是偶滴名言,嘎嘎!

當然要再次編碼了,或者說重新編碼!

  還記得不?剛才我們解碼的時候得到一個利用JVM解碼的字元或字串(也可以說Unicode)

 好,如果不記得,麻煩你再看看上面寫的,記性太差了!

  我們利用這個字元或字串再重新編碼。

 我們把這個字元或字串再次現出原形,也就是位元組陣列。

  byte[] data = str.getBytes("ISO-8859-1");

 好,現在又獲得了“ISO-8859-1”字符集下的位元組陣列。

這個裡面就完整的存放著我們想要的漢字,哈哈。

得到了位元組陣列,不就好辦了嗎?

還不會?沒關係,我教你!

String newstr = new String(data,“GBK”);

好了,得到了我們完整的字串了!編碼變成!

這個字串就是我們要的中文系統下的字串,它又經過我們“GBK”編碼過了!

可以放心的輸出到中文系統下了。

其實說白了,編碼解碼就是把我們從系統得到的字元轉換成位元組陣列,然後對它用系統字符集加工,加工完後再重新包裝,再把它輸出。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=664992


相關文章