PHP开发中编码那点事

来源:互联网 发布:网络传真机好用吗 编辑:程序博客网 时间:2024/05/16 17:11
 如果文件的编码采用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编码的中文字符

原创粉丝点击