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编码的中文字符



上一篇: PHP中include与include_once加载文件性能测试
下一篇: CURL用法
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: php
相关日志:
评论: 0 | 引用: 0 | 查看次数: 1692
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭

 广告位

↑返回顶部↑