
PHP 中使用 strlen() 和数组下标遍历 UTF-8 编码的多字节字符(如 á)会导致字符被错误截断,进而输出乱码(如 `);根本原因是strlen()按字节计数,而á` 在 UTF-8 中占 2 字节,直接索引会破坏其编码完整性。
php 中使用 `strlen()` 和数组下标遍历 utf-8 编码的多字节字符(如 `á`)会导致字符被错误截断,进而输出乱码(如 ``);根本原因是 `strlen()` 按字节计数,而 `á` 在 utf-8 中占 2 字节,直接索引会破坏其编码完整性。
在 PHP 中处理含重音符号、中文、emoji 等 Unicode 字符时,必须区分「字节」与「字符」的概念。UTF-8 是一种变长编码:ASCII 字符(如 a、l)占 1 字节,而带重音的 á 实际由两个字节 0xC3 0xA1 组成。当你用 $text[$d] 访问字符串时,PHP 将其视为字节数组(自 PHP 7.4 起默认行为),而非 Unicode 字符序列。因此循环中:
$text = "ála"; for ($d = 0; $d "; }
执行过程如下:
- strlen("ála") 返回 4(á 占 2 字节 + l + a 各 1 字节);
- $text[0] → 第 1 字节 0xC3 → 无效 UTF-8 单字节 → 显示为 ``;
- $text[1] → 第 2 字节 0xA1 → 同样无效 → 再次显示 ``;
- $text[2] → l → 正常;
- $text[3] → a → 正常;
结果即为:`
`
l
a。
✅ 正确解决方案:使用多字节安全函数
推荐方式(PHP ≥ 7.4):
$text = "ála";
$chars = mb_str_split($text, 1, 'UTF-8'); // 按字符拆分,指定编码
foreach ($chars as $char) {
echo htmlspecialchars($char, ENT_QUOTES, 'UTF-8') . "<br>";
}
// 输出:á<br>l<br>a
兼容旧版 PHP(需启用 mbstring 扩展):
$text = "ála"; $len = mb_strlen($text, 'UTF-8'); for ($i = 0; $i "; }
⚠️ 关键注意事项:
- 确保脚本文件本身以 UTF-8 无 BOM 编码保存;
- HTML 响应头或 标签声明 charset:;
- 始终显式指定 'UTF-8' 参数给 mb_* 函数,避免依赖 mb_internal_encoding() 的全局设置;
- 避免混用 strlen()/substr() 与 mb_strlen()/mb_substr() —— 二者操作维度不同,不可互换。
? 总结:处理国际化文本时,永远优先选用 mbstring 扩展提供的多字节安全函数,而非原生字节级字符串函数。这是保障 PHP Web 应用正确渲染各类语言字符的基石实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











