PHP 检测utf8编码字符串的方法

在软件开发中,我们经常会遇到最让人头疼的编码问题,由于各种网络软件之间使用的默认编码都不一致也就导致了解码的不一致,最终出现了乱码问题,有时候不得不自己使用方法来转换一些网络上的数据,总结一下PHP中针对UTF-8编码字符串的几种检测方法,方便大家查阅。

jesen
1
2020-04-21 06:49:29
文档目录
我的书签
 

PHP 根据utf8编码规则来检测utf8编码的字符串

我们都知道任何一种字符编码都是有它的一种编码规则,如果知道了它的编码规则就可以根据这个规则来判断一个字符是否属于这一种编码,代码实现如下:

一、获取字符串中的每个字符来判断

function is_utf8($string) {
    $c=0; $b=0;
    $bits=0;
    $len=strlen($string);
    for($i=0; $i<$len; $i++){
        $c=ord($string[$i]);
        if($c > 128) {
            if(($c >= 254)) return false;
            elseif($c >= 252) $bits=6;
            elseif($c >= 248) $bits=5;
            elseif($c >= 240) $bits=4;
            elseif($c >= 224) $bits=3;
            elseif($c >= 192) $bits=2;
            else return false;
            if(($i+$bits) > $len) return false;
            while($bits > 1){
                $i++;
                $b=ord($string[$i]);
                if($b < 128 || $b > 191) return false;
                $bits--;
            }
        }
    }
    return true;
}
$string = file_get_contents("i://test.txt");
echo is_utf8($string);

二、使用正则匹配所有可能的编码规则

function is_utf8($string) {
    return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
}
$string = file_get_contents("i://test.txt");
echo is_utf8($string);
友情提示