PHP開發中編碼那點事

 如果文件的編碼採用utf8格式,且在文件的開頭寫入了UTF8 BOM(即第一到第三個字符的十六進制分別是EF BB BF,用UltraEdit打開切換到十六進制可以看到),則可以通過下面的isUtf8函數判斷文件本身的編碼。

function isUtf8($file) {
    $content = file_get_contents($file);
    $charset[1] = substr($content, 0, 1);
    $charset[2] = substr($content, 1, 1);
    $charset[3] = substr($content, 2, 1);
    
    if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191){
        return true;
    } else {
        return false;
    }
}
var_dump(isUtf8('test2.php'));

如果某個文件本身是UTF8編碼,但是前面三個字符不是EF BB BF,則表示沒有寫入BOM。例如我打開某個UTF8編碼的文件前面三個字符分別是3C 3F 70,實際上是<?p三個字符,具體可以看
ascii table


判斷中文和編碼有關,gbk是雙字節,utf8是三字節,可以根據中文的範圍來判斷。

編碼範圍

1. GBK (GB2312/GB18030)
\x00-\xff GBK雙字節編碼範圍
\x20-\x7f ASCII
\xa1-\xff 中文
\x80-\xff 中文

2. UTF-8 (Unicode)
\u4e00-\u9fa5 (中文)
\x3130-\x318F (韓文
\xAC00-\xD7A3 (韓文)
\u0800-\u4e00 (日文)
if(preg_match('/[\x{4e00}-\x{9fa5}]/u',$str)==1)
{
   echo "含有中文字符\n";
 
}

假設某個文件前面三個字符不是EF BB BF,而文件本身的編碼不確認,你的系統的數據庫編碼是UTF8,爲了保證將此文件中的數據導入到數據庫後不亂碼,則需要作一下判斷,如果文件中的中文是UTF8編碼,則不需要進行編碼轉換,否則需要進行編碼轉換。

下面做個測試
文件本身是utf-8編碼的。

<?php
$str = 'utf8編碼的漢字測試';

if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $str) == 1) {
   echo "含有UTF8編碼的中文字符\n";  
} else {
    echo "不含有UTF8編碼的中文字符\n";  
}
?>

輸出:
含有UTF8編碼的中文字符

<?php
$str = 'utf8編碼的漢字測試';
$str = iconv('UTF-8', 'GBK', $str);

if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $str) == 1) {
   echo "含有UTF8編碼的中文字符\n";  
} else {
    echo "不含有UTF8編碼的中文字符\n";  
}
?>

輸出:
不含有UTF8編碼的中文字符

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章