因為自己使用字元編碼一般的是utf-8編碼,但如果對方的部落格使用gb2312編碼的話,POST過來就會出現亂碼(除非對方POST前先轉換編碼)。在不能保證對方是否一定使用utf-8編碼的情況下,自己做一個編碼的檢查和轉換是很有必要的。
寫了個函數來完成這個工作,原理很簡單,因為gb2312/gbk是中文兩位元組,這兩個位元組是有取值範圍的,而utf-8中漢字是三位元組,同樣每個位元組也有取值範圍。而英文不管在何種編碼情況下,都是小於128,只佔用一個位元組(全形除外)。
如果是檔案形式的編碼檢查,還可以直接check utf-8的BOM資訊,關於這方面的東西,大家可以看看TP工具箱的編碼轉換功能,我在那個AppCodingSwitch類中寫了比較詳細的注釋。
話不多說,直接上函數,這個函數是用來對字串進行檢查和轉碼的。檔案的檢查與轉碼
複製代碼 代碼如下:
function safeEncoding($string, $outEncoding = 'UTF-8') {
$encoding = "UTF-8";
for ($i = 0; $i < strlen($string); $i++) {
if (ord($string{$i}) < 128)
continue;
if ((ord($string{$i}) & 224) == 224) {
//第一個位元組判斷通過
$char = $string{++$i};
if ((ord($char) & 128) == 128) {
//第二個位元組判斷通過
$char = $string{++$i};
if ((ord($char) & 128) == 128) {
$encoding = "UTF-8";
break;
}
}
}
if ((ord($string{$i}) & 192) == 192) {
//第一個位元組判斷通過
$char = $string{++$i};
if ((ord($char) & 128) == 128) {
//第二個位元組判斷通過
$encoding = "GB2312";
break;
}
}
}
if (strtoupper($encoding) == strtoupper($outEncoding))
return $string;
else
returniconv($encoding, $outEncoding, $string);
}