使用str_split处理特殊字符出现Undefined offset错误及乱码问题
问题原因
- 「Undefined offset」报错:PHP数组为0起始索引,你当前
rand(1, sizeof($arr))的取值范围包含了等于数组长度的数值,超出了最大合法索引(数组长度-1),因此访问了不存在的数组下标。 - 乱码问题:确实和UTF-8编码相关。
str_split()默认按单字节切割字符串,你用到的希腊字母、版权符号等都是多字节UTF-8字符,切割后单字节无法组成完整字符,就会出现�乱码。
修复方案
先确认你的PHP源码使用UTF-8无BOM格式保存,再将代码修改为如下版本:
function ornamento() { // 改用多字节拆分函数,保证单个字符完整 $izq = mb_str_split("[{(]})"); $der = mb_str_split("]})[{("); $med = mb_str_split("+÷×=#®©$%&?¿"); $cen = mb_str_split("ΔΘЖΣΤΥΦΧΨΩ"); // 调整随机下标范围,匹配0起始的数组索引规则 $idx1 = rand(0, count($izq) - 1); $idx2 = rand(0, count($izq) - 1); $mix1 = rand(0, count($med) - 1); $mix2 = rand(0, count($med) - 1); $cix = rand(0, count($cen) - 1); $ornamento = $izq[$idx1] . $izq[$idx2] . $med[$mix1] . $med[$mix2] . $cen[$cix] . $med[$mix2] . $med[$mix1] . $der[$idx2] . $der[$idx1]; echo $ornamento; }
如果你的PHP版本低于7.4(mb_str_split为7.4新增函数),可以新增自定义多字节拆分函数替代:
function custom_mb_str_split($string, $length = 1) { $result = []; $str_len = mb_strlen($string); for ($i = 0; $i < $str_len; $i += $length) { $result[] = mb_substr($string, $i, $length); } return $result; }
使用时把代码里的mb_str_split替换为custom_mb_str_split即可。
内容的提问来源于stack exchange,提问作者holoman
相关产品推荐
相关产品推荐

