透過逐位元組檢測範圍,即可判斷字串編碼。檔案形式還可檢查 UTF-8 BOM(EF BB BF)。
<?php
function safeEncoding($string, $outEncoding = 'UTF-8') {
$encoding = "UTF-8";
for ($i = 0; $i < strlen($string); $i++) {
if (ord($string[$i]) < 128) continue;
// UTF-8 三位元組檢測
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;
}
}
}
// GB2312/GBK 兩位元組檢測
if ((ord($string[$i]) & 192) == 192) {
$char = $string[++$i];
if ((ord($char) & 128) == 128) {
$encoding = "GB2312";
break;
}
}
}
if (strtoupper($encoding) == strtoupper($outEncoding)) return $string;
return iconv($encoding, $outEncoding, $string);
}
?>
EF BB BF,位於檔案開頭,標示編碼。Windows 記事本儲存 UTF-8 預設加 BOM,但 Unix 系統不建議,會干擾 Shebang、HTTP Header 輸出等。FE FF (BE)、FF FE (LE)。實際專案中,建議統一專案編碼為 UTF-8 無 BOM,儲存、輸出、資料庫連線皆設定一致,避免編碼地獄。