PHP 8.0 中判断含日文、韩文的字符串长度必须用 mb_strlen($str, 'UTF-8'),因 strlen() 按字节计数导致结果失真(如“こんにちは”返回15而非5),且需显式指定编码、校验字符串类型与UTF-8有效性,截断须用 mb_substr(),并确保 mbstring 扩展已启用。

PHP 8.0 判断含日文、韩文的字符串长度,必须用 mb_strlen($str, 'UTF-8'),不能用 strlen(),否则结果会严重失真——比如日文“こんにちは”(5个字符)用 strlen() 返回 15(UTF-8 下每个字占 3 字节),而 mb_strlen() 正确返回 5。
必须显式指定 UTF-8 编码
即使 PHP 环境默认是 UTF-8,也务必在每次调用时传入第二个参数 'UTF-8':
-
mb_strlen($str, 'UTF-8')是安全写法;mb_strlen($str)依赖mb_internal_encoding(),线上配置不一致时容易出错 - 日文(如平假名、片假名、汉字)、韩文(谚文音节,如“가나다”)在 UTF-8 中均为多字节字符,只有
mb_*函数能按 Unicode 码点准确计数 - 若数据源编码不确定(如来自旧系统 GBK 或 Shift-JIS),先转码:
$str = mb_convert_encoding($str, 'UTF-8', 'auto');
提前校验类型和编码有效性
避免因空值、乱码或非法字节导致 mb_strlen() 返回 false 或 0:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 先判断是否为字符串:
is_string($str) && $str !== '' - 再检查是否为合法 UTF-8:
mb_check_encoding($str, 'UTF-8'),不通过则转换或跳过 - 例如:
if (is_string($str) && mb_check_encoding($str, 'UTF-8')) { $len = mb_strlen($str, 'UTF-8'); }
配套截断也要用 mb_* 函数
如果后续要做标题截断(如限制 20 字符),必须搭配 mb_substr($str, 0, 20, 'UTF-8'):
立即学习“PHP免费学习笔记(深入)”;
-
substr()按字节切,会把一个日文假名或韩文字母从中间劈开,产生乱码 -
mb_substr()按字符边界操作,保证每个字完整,且自动处理不足长度的情况(如原串只有 12 字符,就返回全部) - 加省略号时预留空间:
$truncated = mb_substr($str, 0, 19, 'UTF-8') . ($len > 19 ? '…' : '');,确保总长 ≤ 20 字符
注意 mbstring 扩展必须启用
mb_strlen() 不是 PHP 核心函数,依赖 mbstring 扩展:
- 运行
php -m | grep mbstring确认已加载 - Docker 镜像中常需手动安装,如 Alpine:
apk add php82-mbstring;Debian/Ubuntu:apt install php-mbstring - Windows 下检查
php.ini是否开启extension=php_mbstring.dll


















