使用mb_split拆分阿拉伯语时出现异常字符问题求助
阿拉伯语文本拆分后取首字符出现乱码的解决办法
你的问题出在两个核心点:
- 单字节方式截取多字节字符:阿拉伯语是UTF-8多字节编码,
$words[$i][0]会按单字节截断字符,导致原本完整的阿拉伯语字符被拆分成乱码片段。 - 未处理冗余空白:原字符串包含换行、多连续空格,
mb_split("\s")会拆分出空元素,后续取首字符时也会产生无效内容。
修复后的代码
<?php mb_internal_encoding("UTF-8"); function fatehah(){ $surah = " بِسْمِ ٱللَّهِ ٱلرَّحْمَـٰنِ ٱلرَّحِيمِ ١ٱلْحَمْدُ لِلَّهِ رَبِّ ٱلْعَـٰلَمِينَ ٢ٱلرَّحْمَـٰنِ ٱلرَّحِيمِ ٣مَـٰلِكِ يَوْمِ ٱلدِّينِ ٤إِيَّاكَ نَعْبُدُ وَإِيَّاكَ نَسْتَعِينُ ٥ٱهْدِنَا ٱلصِّرَٰطَ ٱلْمُسْتَقِيمَ ٦صِرَٰطَ ٱلَّذِينَ أَنْعَمْتَ عَلَيْهِمْ غَيْرِ ٱلْمَغْضُوبِ عَلَيْهِمْ وَلَا ٱلضَّآلِّينَ ٧ "; // 清理所有冗余空白:替换多空白为单空格,再去除首尾空白 $cleaned_surah = preg_replace('/\s+/u', ' ', trim($surah)); // 按Unicode空格拆分字符串,确保兼容多字节文本 $words = preg_split('/\s/u', $cleaned_surah); $word = []; foreach($words as $w){ // 用多字节函数取首字符,避免截断 if(!empty($w)){ $word[] = mb_substr($w, 0, 1, "UTF-8"); } } return $word; } $selwords = fatehah(); var_dump($selwords); ?>
关键修改说明
- 空白清理:
preg_replace('/\s+/u', ' ', trim($surah))统一处理所有Unicode空白类型,避免拆分出空元素。 - 正确拆分:
preg_split加u修饰符,确保按Unicode标准拆分多字节文本,而非单字节。 - 多字节取首字符:用
mb_substr替代直接下标访问,保证完整截取阿拉伯语的单个字符,不会出现乱码。
内容的提问来源于stack exchange,提问作者Joe Shamuraq
相关产品推荐
相关产品推荐

