在 IE 瀏覽器傳遞 GET 參數中文遇到亂碼

昨天被丟了一個問題:同一隻 PHP 程式在 Chrome/Firefox 丟中文參數沒問題,怎麼在 IE (Microsoft Internet Explorer) 就會亂碼?

code 大概長這樣,主要是把傳入的參數存入 DB 裡面,資料庫用的是 UTF-8 的編碼

$con = mysql_connect('127.0.0.1','id','pw');
mysql_select_db('test', $con);
mysql_query('set names 'utf8'');
$msg = $_GET['msg'];
$sql = 'INSERT INTO `db` . `table` (`column`) VALUES (' . $msg . ')';
mysql_query($sql, $con);
mysql_close($con);

問題其實是出在 IE 傳遞參數時會以 ANSI 來編碼 (即便網頁編碼是UTF-8),自然會出現亂碼的問題,基於現在 UTF-8 是主流,所以可以在使用傳入的參數之前使用 PHP 內建的 mb_detect_encoding 做這樣的處理:

$encode = mb_detect_encoding($msg, array ('UTF-8', 'BIG5', 'GB2312'));
if ($encode && $encode != 'UTF-8') {
    $msg = iconv ($encode, 'UTF-8', $msg);
}

{ "UTF-8", "BIG5", "GB2312" } 這段可以依序換成要被識別的編碼,在編碼可以辨識(有被列入)且不是 UTF-8 的情況下會用 PHP 內建的 iconv 來做轉換的動作, 就可以解決這樣的問題啦~