PHP的strrev()函数不支持UTF-8多字节字符,会导致中文、emoji等乱码;应使用mb_substr+mb_strlen逐字符反转,或preg_match_all('/./u')配合array_reverse实现Unicode安全反转。

PHP 的 strrev() 函数只按字节反转字符串,不识别多字节字符(如中文、日文、emoji),会导致 UTF-8 编码的汉字被拆成多个字节后错位,出现乱码或问号。解决的关键是**用支持 Unicode 的函数逐字符反转,而不是逐字节**。
用 mb_substr + mb_strlen 实现安全反转
这是最常用且兼容性好的方法:先获取字符串总字符数(非字节数),再从末尾逐个截取 Unicode 字符拼接。
- 使用
mb_strlen($str, 'UTF-8')获取真实字符长度 - 用
mb_substr($str, $i, 1, 'UTF-8')每次取一个完整字符(不是字节) - 循环从最后一个字符开始向前拼接
示例代码:
<?phpfunction mb_strrev($str) {
$len = mb_strlen($str, 'UTF-8');
$reversed = '';
for ($i = $len - 1; $i >= 0; $i--) {
$reversed .= mb_substr($str, $i, 1, 'UTF-8');
}
return $reversed;
}
echo mb_strrev("你好世界?"); // 输出:?界世好你
?>
用 preg_match_all 按 Unicode 字符分割后反转
利用正则表达式匹配所有 Unicode 字符(包括 emoji、组合字符),再用 array_reverse() 反转数组,最后合并。
立即学习“PHP免费学习笔记(深入)”;
- 模式
'/./u'中的u修饰符启用 UTF-8 模式,确保正确匹配多字节字符 - 适用于含复杂 Unicode 序列(如带变音符号的字母、ZWNJ 等)的场景
示例代码:
<?phpfunction mb_strrev_regex($str) {
if (preg_match_all('/./u', $str, $chars) === false) {
return $str;
}
return implode('', array_reverse($chars[0]));
}
echo mb_strrev_regex("café??"); // 输出:??éfác
?>
确认并统一编码环境
即使用了多字节函数,如果源字符串本身不是合法 UTF-8,或脚本未声明编码,仍可能出错。
- 用
mb_detect_encoding($str, ['UTF-8', 'GB2312', 'BIG5'], true)检查实际编码 - 必要时用
mb_convert_encoding($str, 'UTF-8', 'auto')转换为标准 UTF-8 - 确保 PHP 文件保存为 UTF-8 无 BOM,且 HTTP 响应头或 HTML meta 声明 charset 为 UTF-8
现代 PHP 可选:使用 Intl 扩展(PHP 7.4+)
如果服务器启用了 intl 扩展,可用 UConverter::transliterate() 或自定义规则,但日常开发中 mb_* 函数已足够稳定高效。
不复杂但容易忽略:只要记住——处理中文、日文、emoji 时,永远优先用 mb_* 系列函数替代原生单字节函数。



















