由於程式程式設計過程中存在眾多的編碼集,而這些編碼集又各自有自己的方法來表示乙個中文字元。由此,造成我們的程式顯示中文的時候亂碼。最多的是本來是中文,但結果顯示為問號?
這篇文章從我碰到過的問題來從根本上解決亂碼的問題,反正我用這個方法是百戰百勝^_^嘎嘎
我們知道,在我們的中文系統中使用的是「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:
徹底解決全站亂碼
先分析一下出現亂碼的幾種情況 資料在頁面顯示有亂碼 也就是伺服器獲取資料時沒有問題,在客戶端上顯示資料為亂碼,這種情況最好解決,只需修改頁面的編碼即可 pageencoding utf 8 資料到伺服器後有亂碼 通常出現在表單提交資料給伺服器,伺服器獲取時得到的是亂碼,以tomcat為例,出現這種情...
Matplotlib 徹底解決中文亂碼問題解決方案
win10 和 mac都是雙擊開啟然後安裝即可。找到matplotlib字型資料夾,不知道matplotlib檔案在 的話,執行下面python import matplotlib matplotlib.matplotlib fname 輸出matplotlib包所在的配置檔案的路徑修改matplo...
Python徹底解決採集網頁亂碼問題
python徹底解決網頁採集亂碼問題,準確率 99 def download page indexurl,timeout 10 param indexurl param timeout return try res urllib2.urlopen indexurl,timeout timeout c...