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

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

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

PHP使用 mb_detect_encoding方法 检测UTF8编码的字符串

PHP中 mb_detect_encoding方法可以检测给定的字符串的编码,但是它不能检测所有的编码类型,只能检测给定的几种类型(mbstring 当前实现了针对编码:UTF-8, UTF-7, ASCII, EUC-JP,SJIS, eucJP-win, SJIS-win, JIS, ISO-2022-JP 的检测筛选器。对于其他编码的字符串检测将会失败;对于 ISO-8859-*,mbstring 总是检测为 ISO-8859-*;对于 UTF-16、UTF-32、 UCS2 和 UCS4,编码检测总是会失败)如下代码:
function is_utf8($string) {
    mb_detect_order("UTF-8, UTF-7, ASCII, EUC-JP,SJIS, eucJP-win, SJIS-win, JIS, ISO-2022-JP"); //
    return mb_detect_encoding($string) === 'UTF-8';
}
$string = file_get_contents("i://test.txt"); //文本文件中可以将内容另存为为不同的编码类型,以便测试使用
is_utf8($string);

PHP使用 正则表达式检测UTF8编码的字符串

PHP中的正则表达式PCRE,提供了一种可以以utf8编码来匹配字符串的匹配模式,我们可以使用这个特性来达到我们的编码检测,代码如下:
function is_utf8($string) {
    return preg_match('/^.*$/u', $string); //使用到了/u的匹配模式
}
$string = file_get_contents("i://test.txt");
echo is_utf8($string);

PHP使用 iconv函数检测UTF8编码的字符串

iconv函数是一个字符编码转换函数,它可以将一个字符由一种字符编码转换为另一种字符编码,我们可以利用它这一个特点来达到我们检测字符串编码的需求,代码如下:
function is_utf8($string) {
    return @iconv("UTF-8",'UTF-8//IGNORE', $string) == $string;
}
$string = file_get_contents("i://test.txt");
echo is_utf8($string);

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);
友情提示