PHP字母转数字处理阿拉伯语等非英文字符失效问题咨询
故障原因
原有代码仅能正常处理单字节编码的英文字符:
- PHP原生
strlen()是按字节统计字符串长度,$input[$i]的字符串偏移取值也是按字节定位 - 阿拉伯语、乌尔都语等非英文字符在UTF-8编码下属于多字节字符,单个字母通常占2~3个字节,原有循环逻辑会把一个完整字母拆成多个无意义的字节碎片,既匹配不上映射规则,也会输出乱码。
修复方法
使用PHP的mbstring多字节字符串扩展提供的函数替换原生字节操作函数,按「字符」而非「字节」处理字符串即可,修复后完全兼容原有英文转换逻辑,不需要修改已写好的英文字母映射配置。
修复后的完整代码:
// 全局设置内部编码为UTF-8,避免编码识别偏差 mb_internal_encoding("UTF-8"); $input = "ب"; $remap = [ "ا" => '200', "ب" => '300', "ج" => '50', "د" => '100', ]; $array = []; // 按字符数统计输入长度,替代原有的字节长度计算 for ($i = 0; $i < mb_strlen($input); $i++) { // 按字符偏移截取单个完整字符,替代原有的字节偏移取值 $c = mb_substr($input, $i, 1); $array[] = $remap[$c]; } $star = "(" . implode(',', $array) . ")"; echo $star;
注意事项
- 请确保运行环境已开启
mbstring扩展,绝大多数默认安装的PHP环境都默认开启该扩展 - 所有代码文件保存时请选择
UTF-8 无BOM编码格式,否则字符本身存储就会异常,无法正常匹配映射规则 - 乌尔都语、中文等其他非英文的多字节字符映射,都可以用同样的逻辑实现
内容的提问来源于stack exchange,提问作者Qaiser420
相关产品推荐
相关产品推荐

