本文详解为何直接使用 strlen() 和字符串下标访问阿拉伯语等 Unicode 字符会失败,并提供基于 mb_* 多字节函数的安全解决方案,确保中、阿、乌尔都语等非 ASCII 字母精准映射为对应数字。
本文详解为何直接使用 `strlen()` 和字符串下标访问阿拉伯语等 unicode 字符会失败,并提供基于 `mb_*` 多字节函数的安全解决方案,确保中、阿、乌尔都语等非 ascii 字符精准映射为对应数字。
在 PHP 中,字符串操作默认按字节(byte)而非字符(character)进行处理。英文字符(ASCII)每个仅占 1 字节,因此 strlen($str) 和 $str[$i] 能正常工作;但阿拉伯语、中文、乌尔都语等使用 UTF-8 编码的字符通常占用 2–4 字节(例如阿拉伯字母 "ب" 在 UTF-8 中占 2 字节),此时:
✅ 正确做法:全程使用多字节安全函数
需用 mb_strlen() 替代 strlen() 获取字符长度,并用 mb_substr($str, $start, 1) 提取单个 Unicode 字符(而非 $str[$i]):
<?php$input = "بج"; // 示例:两个阿拉伯字符$remap = [ "ا" => '200', "ب" => '300', "ج" => '50', "د" => '100',];$array = [];for ($i = 0; $i < mb_strlen($input, 'UTF-8'); $i++) { $c = mb_substr($input, $i, 1, 'UTF-8'); // 显式指定编码更稳妥 if (isset($remap[$c])) { $array[] = $remap[$c]; } else { $array[] = '?'; // 或抛出异常/跳过未知字符 }}$result = "(" . implode(',', $array) . ")";echo $result; // 输出:(300,50)
? 关键注意事项:
通过以上改造,你的字母数字映射工具即可无缝支持英语、阿拉伯语、乌尔都语、中文拼音乃至任何 UTF-8 编码文字,真正实现国际化健壮转换。