在软件开发中,我们经常会遇到最让人头疼的编码问题,由于各种网络软件之间使用的默认编码都不一致也就导致了解码的不一致,最终出现了乱码问题,有时候不得不自己使用方法来转换一些网络上的数据,总结一下PHP中针对UTF-8编码字符串的几种检测方法,方便大家查阅。
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);
PCRE
,提供了一种可以以utf8编码来匹配字符串的匹配模式,我们可以使用这个特性来达到我们的编码检测,代码如下:function is_utf8($string) { return preg_match('/^.*$/u', $string); //使用到了/u的匹配模式 } $string = file_get_contents("i://test.txt"); echo is_utf8($string);
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);
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);