PHP中反转希伯来语字符串出现�乱码的问题排查
希伯来文字符串反转/单字符访问乱码:问题根源与解决办法
嘿,这个问题其实是PHP字符串处理的经典“坑”——核心原因在于PHP默认把字符串当作字节序列,而非Unicode字符序列,而希伯来文是UTF-8编码,每个字符需要占用2个字节来存储。
乱码的具体由来
- 当你调用
strrev($mother_name)时,它会把整个字符串的字节顺序反转,而不是字符顺序。比如原本一个希伯来文字符的两个字节是A B,反转后变成B A,这就成了无效的UTF-8字节组合,系统无法识别,就会用�这个**标准替换字符(REPLACEMENT CHARACTER)**来表示无法解析的内容。 - 同理,
$mother_name[0]取的是字符串的第一个字节,单独这个字节根本构不成一个有效的希伯来文字符,自然也会显示�。
解决办法
1. 正确反转Unicode字符串
要按字符而非字节反转,得先把字符串拆成单个Unicode字符,再反转拼接:
$mother_name = "סבטלנה ואסילבנה"; // 按UTF-8字符拆分字符串 $char_array = mb_str_split($mother_name, 1, 'UTF-8'); // 反转数组后拼接成字符串 $reversed_str = implode('', array_reverse($char_array)); echo $reversed_str;
或者用循环结合mb_substr实现:
$reversed_str = ''; $str_length = mb_strlen($mother_name, 'UTF-8'); for ($i = $str_length - 1; $i >= 0; $i--) { $reversed_str .= mb_substr($mother_name, $i, 1, 'UTF-8'); } echo $reversed_str;
2. 正确访问单个Unicode字符
别用下标直接取,改用mb_substr指定UTF-8编码:
// 获取第一个字符 $first_char = mb_substr($mother_name, 0, 1, 'UTF-8'); echo $first_char; // 会正确显示"ס"
额外注意
确保你的PHP文件是以UTF-8编码保存的,同时输出时设置正确的响应头,避免额外编码问题:
header('Content-Type: text/html; charset=utf-8');
内容的提问来源于stack exchange,提问作者L. Vadim
相关产品推荐
相关产品推荐

