1. 程式人生 > >淺談亂碼原因及解決方案

淺談亂碼原因及解決方案

前言

其實作為程式猿來講,中國的程式猿遇到的問題可能會比國外的程式猿遇到的問題多很多。
一個原因是因為各種標準的制定、各種IDE的編寫,都是由老外來完成的,制定出來的東西可能和中國人的習慣不太一樣;還有一個原因就是因為國際編碼的問題,通常,外國人寫的東西無需對編碼進行轉換,預設的就是ISO-8859-1;到了中國,就涉及到本土化的問題,中文編碼應當是GBK,這是本地化的編碼。
而各種標準、各種瀏覽器一般用的都是ISO-8859-1,所有就造成了兩種編碼之間的轉換。所以後來出現了UTF8,來解決各種編碼問題。UTF8基本上包含了地球上所有的可見字元,十分強大。
但不幸的是,各種標準並沒有按照這一編碼來制定,而依然沿用以前的做法。
所以,解決各種亂碼問題,就成了中國程式猿的必不可少的技能之一。
這篇文章,就是要和大家討論種種亂碼問題出現的原因,以及相應的解決辦法,我目前已知的情況共有三種,下面就位大家一一講解。

IDE環境造成的亂碼

其實這個是非常讓人鬱悶的問題,有時候還真的很難發現。現在流行的兩種JavaIDE,idea和eclipse。idea的所有預設編碼都是UTF8格式,基本上統一所有編碼,如果你再idea出現了亂碼問題,一般不是idea自身的問題。
如果你看到idea的控制檯出現了中文亂碼,這很有可能是你選用的字型不支援部分中文造成的,idea不背這個鍋。
對於eclipse,這貨可能是為了讓中國人寫程式碼的時候更加方便,當你點選目錄中的src,然後點選file->Properties->Resources,你會看到,TextFile Encoding預設是GBK。是不是很絕望,為了下次不再因為這個問題產生亂碼,記得建立資料夾以後就配置一下src的encodeing,還是剛剛的那個路徑,改成UTF-8就行了。
也許你會說,我根本就沒發現這裡有什麼問題啊,我一直是這種設定也沒有發生過亂碼。我只能說,那是因為你沒有遇到過。
最常見的一個場景就是web應用中(不使用框架),當你提交的表單中存在file域的時候,你可能會使用一些檔案上傳元件,這些元件處理資訊的時候,會將表單中的資料變成UTF8或者你設定的格式,但是,如果你的檔案編碼是GBK的話,就肯定就會碰到亂碼的問題了。具體原因有待深究,但個人覺得這可能是因為編譯後的class位元組碼檔案處理資訊過程的問題。

POST和GET方法傳遞引數造成的亂碼

如果你發現更改了檔案編碼並且重新build以後,還是出現亂碼的問題,如果依然是web應用的話,那就很有可能是POST和GET方法傳參造成的亂碼。
這個問題可以看我的文章,POST和GET方法亂碼問題解決方案,寫的其實非常詳細了。

資料庫編碼格式導致的

如果你發現,你從資料庫中讀取出的資料是亂碼的,那麼原因也很簡單,是因為資料庫的字符集配置問題。
首先,進入mysql的控制檯,也就是命令列中。輸入如下語句,檢視mysql的字符集配置。
- 方法一:show variables like 'collation_%';
- 方法二:show variables like 'character_set_%';

如果你看到,字符集列表中有顯示各種字符集的配置都是拉丁文,也就是lantin這樣子的。那麼毫無疑問是因為字符集的配置問題了。對於不同的系統,配置的方法都是相同的,那就是找到mysql檔案的配置資訊路徑,一般linux可以按照我的這篇文章來進行配置,windows也可以參考,只需要找到配置檔案,做最後的字元配置操作即可。windows的mysql配置檔案一般在mysql的安裝目錄下,如果沒有,那麼可以自己建一個名為my.cnf的檔案(如果無效,試試新建mysqld.cnf檔案),然後在檔案中輸入如下配置資訊:

[mysqld]
character-set-server=utf8
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8

結語

好了,這次的文章就到這裡了,如果你喜歡我的文章,請關注我,可以點個贊,支援一下我。想和我交個朋友的,可以郵件聯絡我[email protected]。感謝您的閱讀,再見!