在大三修資料庫系統時就遇到的問題,那時候還沒有完全解決,只知道跟語系有關係,Big5和UTF8的愛恨情仇吧:P
實習也遇到同樣的問題,這時候超強主管教我一勞永逸的方法,也就是設定三個地方,保證不會再出現亂碼,真的這麼神?
1首先,在PHP檔頭向瀏覽器宣示我這個頁面以UTF8的語系來存取:
header('Content-Type: text/html; charset=utf8');
2接著,待PHP和MySQL成功建立連結之後,設定以下三行:
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET_CLIENT='utf8'");
mysql_query("SET CHARACTER_SET_RESULTS='utf8'");
第一行意義詳見:MySQL 的「SET NAMES UTF8」字元編碼問題。
第二行:告訴瀏覽器,client端以UTF8存取資料。
第三行:告訴瀏覽器,server端以UTF8存取資料。
3最後,資料庫裡的欄位只要有儲存中文字,其「校對」都設定為「utf8_general_ci」。
實際程式碼類似以下作法:
<?php
header('Content-Type: text/html; charset=utf8');
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'wall');
$connection = mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD) or die(mysql_error());
$database = mysql_select_db(DB_DATABASE) or die(mysql_error());
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET_CLIENT='utf8'");
mysql_query("SET CHARACTER_SET_RESULTS='utf8'");
?>
不過呢……我在寫臉書留言系統時遇到的問題是,以上都給予設定了,但還是出現亂碼!!!
原因是這一行$update=htmlentities($update);,$update裡有中文字,經過htmlentities()這個函式之後,中文字就會變成亂碼。若改用$update=htmlspecialchars($update);,這樣中文字就能正常顯示。其實也可以都不用這兩個函式,但是若使用者的輸入含有html標籤如「<b>HappyMan</b>」、會在瀏覽器上顯示「HappyMan」。
htmlentities會轉化所有的html代碼,若字串中只有英文、數字則兩個函式結果相同,若是其中含有無法識別的中文字結果就不同了,中文字也會被轉換了。
測試一下這一行字「嗨囉~我是逍遙文:)」, htmlentities得到:「å」,htmlspecialchars得到:「嗨囉~我是逍遙文:)」
測試一下這一行字「Hello~I am HappyMan:)」, htmlentities得到:「Hello~I am HappyMan:)」,htmlspecialchars得到:「Hello~I am HappyMan:)」
保險起見,最好是每個專案的連線字串都要加上"SET NAMES UTF8″ 。
基本上 MySQL 資料庫語系設定分五個等級:
1. 伺服器級,即 mysql.ini 的設定。
2. 資料庫級。
3. 資料表級。
4. 資料欄位級。
5. 連線校對級。
數字愈大的等級,其效力可以覆蓋之前的設定。所以 5 > 4 > 3 > 2 > 1 。
所以,如果 MySQL 伺服器預設編碼是 big5。我們只要資料表以下的等級全部都設定成 UTF8,理論上就可以獲得正確的結果。
查閱手冊:
其實SET NAMES UTF8;等於下列三行:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
參考:MySQL 中文編碼徹底研究,有詳盡的經驗解法說明;MySQL 的「SET NAMES UTF8」字元編碼問題;
PHP函式 htmlspecialchars 和 htmlentities 差別、htmlspecialchars()—函數把預定義的字符轉換為 HTML 實體、htmlentities()—函數把字符轉換為 HTML 實體。
Comments on: "[PHP][MySQL] 中文亂碼問題" (4)
header(‘Content-Type: text/html; charset=big5’);
解決,謝謝。^__^
讚讚
很高興幫助到你~
讚讚
感謝!
解決問題了
讚讚
恭喜!
讚讚