首先,編碼,在大陸,最常見的也就兩種,一種是utf-8,一種是gbk/gb2312。
gb2312是簡體中文編碼。gbk/gb2312是中文編碼,二者是相對相容的。
資料庫儲存資料,一般採用utf8編碼方式。而常常我們windows系統預設的編碼方式是gb2312,這就出現了編碼不統一的問題。
情景:
寫入資料庫。此時:我們需要將編碼改為utf8後,才能往資料庫儲存。
其實,只需要簡單的三步:判斷編碼,編碼轉換,寫入資料庫。(僅提供gbk/gb2312 與 utf8編碼之間的轉換,其他非主流類似處理即可)
一、判斷編碼
有很多種方式,我現在用的是這種:
function is_utf8($string) {
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E]
| [\xC2-\xDF][\x80-\xBF]
| \xE0[\xA0-\xBF][\x80-\xBF]
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| \xF0[\x90-\xBF][\x80-\xBF]{2}
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
)*$%xs', $string);
}
這是各種編碼的區間:
$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
通過此函數,稍作修改即可:
function is_utf8($string) {
return preg_match('/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/', $string);
}
二、編碼轉換
編碼轉換一般有三種方式:1、iconv 2、mbstring擴充 3、自寫轉換函式
2、因為我php開啟了mbstring擴充,我使用的是此方式。
//utf-8 to gb2312
$str = mb_convert_encoding("楊森", "gb2312", "utf-8");
//GBK to UTF-8
$str = mb_convert_encoding($str, "utf-8", "GBK");
1、iconv轉換
//UTF-8 to GB2312
//UTF-8轉換時有小bug,請在第二個參數後加"//IGNORE"
iconv("UTF-8","GB2312//IGNORE",$data)
//GB2312 to UTF-8
iconv('GB2312', 'UTF-8', $str);
3、自寫轉換函式,我還沒自己寫過,沒有自己的,寫上來也是網上查詢所得。所以建議網上自行查詢。
4、如果牽涉到檔案上傳的編碼,可使用以上函數直接讀入然後寫入即可。
file_get_contents($path);
if(!is_utf8($str)) {
$str = mb_convert_encoding($str, "utf-8", "gbk");
file_put_contents($path, $str);
}
然後就寫入資料庫了。