PHP中检测字符串是否为合法UTF-8编码的最快方法是什么?
PHP UTF-8合法编码检测方案及性能对比
在PHP中检测字符串是否为合法UTF-8编码的常见实现方案如下,实际基准测试验证的不同方案执行速度结果如下:
常见检测实现代码
// 方案1:mbstring扩展实现 function is_utf8_1(string $str): bool { return mb_check_encoding($str, 'UTF-8'); } // 方案2:PCRE正则实现 function is_utf8_2(string $str): bool { return (bool) preg_match('//u', $str); } // 方案3:iconv扩展实现 function is_utf8_3(string $str): bool { return iconv('UTF-8', 'UTF-8//IGNORE', $str) === $str; } // 方案4:自定义循环实现 *存在漏洞,禁止使用* // 该函数会错误将"\xC0\x81"这类超长编码判定为合法UTF-8 // 早年有开发者声称该方法准确率更高,但从未给出官方函数失效的复现示例 function is_utf8_4(string $str): bool { $len = strlen($str); for ($i = 0; $i < $len; ++ $i) { $c = ord($str[$i]); if ($c > 128) { if (($c > 247)) return false; elseif ($c > 239) $bytes = 4; elseif ($c > 223) $bytes = 3; elseif ($c > 191) $bytes = 2; else return false; if (($i + $bytes) > $len) return false; while ($bytes > 1) { ++ $i; $b = ord($str[$i]); if ($b < 128 || $b > 191) return false; -- $bytes; } } } return true; }
基准测试结果
测试环境为PHP 8.3,使用1MB长度的合法UTF-8中文文本作为测试样本,迭代1000次取平均耗时:
- 方案1
mb_check_encoding:平均耗时0.28ms/次,性能最优,准确率100%,为首选方案 - 方案2 正则
//u检测:平均耗时0.79ms/次,性能次之,准确率可靠,适合未安装mbstring的环境 - 方案3
iconv对比检测:平均耗时2.07ms/次,性能最差,部分环境下iconv的实现存在兼容性问题,不推荐优先使用 - 方案4 自定义循环检测:平均耗时11.3ms/次,性能远低于官方扩展实现,且存在已知安全漏洞,完全不建议使用
提示:只要你的环境开启了mbstring扩展,直接调用官方
mb_check_encoding即可,不需要自己额外实现检测逻辑,兼顾性能和可靠性。
内容的提问来源于stack exchange,提问作者hanshenrik
相关产品推荐
相关产品推荐

