2012年9月15日 星期六

PHP + MySQL 的亂碼解決方法


首先,先來瞭解一下,為什麼會有亂碼!

網頁檔案本身的編碼,以及 HTML 檔案 Metadata 定義的編碼不同:

由於大部分的HTML網頁檔案本身都是由 Dreamweaver、Eclipse、甚至於是微軟的記事本等軟體所產生出來的。其所使用的編碼有可能預設為 big5、utf-8 或其它不同的編碼。假如這個HTML網頁檔案本身是big5,且在HTML的HEAD語法中又將編碼設定為:

<meta http-equiv="Content-type" content="text/html; charset=utf-8">

那麼,當瀏覽器(IE、Firefox、Chrome....)在開啟這個HTML網頁時,第一印象就根據這個meta中所描述的utf-8編碼來顯示這個網頁。

當瀏覽器以utf-8的編碼來讀取big5的檔案編碼時,恭喜您,一堆亂碼將出現在您眼前





因此在這部分請注意,必需將檔案編碼與HTML中的meta所描述的編碼一致,在網頁呈現部分才不會出現亂碼!


NOTE:
通常在HTML引入 Javascript 檔(*.js)時,如Javascript的檔案編碼與meta定義的不相同,且在Javascript中有印出文字的(alert或document.write),亦可能會出現亂碼。


PHP造成的亂碼:

在php.ini 設定檔中,請找尋 default_charset = "xxxxxxxx"
請將「xxxxxxxx」設定為與HTML meta相同的編碼,亦或者將這整行註解掉即可。

default_charset = "utf-8"



;default_charset = "xxxxxxxx"


MySQL造成的亂碼:

MySQL在設定編碼時,可分成資料庫編碼、資料表欄位的編碼。

在資料庫的編碼上及資料表的欄位編碼現在幾乎都設定為 utf8_general_ci 即可,資料庫及資料表的編碼請設定相同的,以免「夜長夢多」!!

基本上,以上所提的 HTML meta、檔案編碼、PHP編碼、MySQL編碼一致的話,99%
就不會再出現亂碼了

起初我也以為是這樣,沒想到在PHP從MySQL讀出資料並 echo 出來後,仍然出現亂碼!
( 天啊 ~ 至於嗎? )

最後還是在 PHP 中連結 database 的下面再加一行mysql_query("SET NAMES 'utf8'");才擺脫了亂碼的窮追猛打!

$link = mysql_connect($host, "xxx", "xxx");
mysql_query("SET NAMES 'utf8'");

NOTE: 請注意「utf8」而非「utf-8」,在這裡中間不加「-」符號

結論:

避免出現亂碼的注意項目為:

1.HTML meta
2.檔案編碼
3.PHP編碼
4.MySQL編碼
5.最後在PHP連線MySQL的後面補上一行 mysql_query("SET NAMES 'utf8'");

以上5點應該可以藥到病除才是

1 則留言:

  1. 感謝您的分享,終於解決我的問題了,就卡在最後一步驟

    回覆刪除