PHP实现自定义替换字母表时ç字符触发数组键未定义报错求助
报错原因
- 核心问题是PHP原生的
str_split()函数仅支持按单字节切割字符串,而ç是UTF-8编码下的多字节字符,占用2个字节,使用str_split()拆分后会被切成两个无效的乱码字节,这两个乱码在你的映射表中不存在对应键,所以抛出未定义数组键的警告。 - 次要排查点:你的PHP源文件本身需要保存为UTF-8 无BOM格式,否则写在映射数组里的
ç本身就是乱码,无法和输入的正常ç匹配。
修复步骤
- 替换多字节字符拆分逻辑,改用PHP多字节扩展的拆分方法,兼容特殊字符。
- 增加映射表键存在判断,避免后续输入未定义字符时再抛出警告。
- 在form标签上增加
accept-charset="utf-8"属性,强制浏览器提交UTF-8编码的内容,避免编码异常。
修改后的代码示例
1. 更新form标签
将原有form标签替换为:
<form method="post" role="form" class="php-email-form" accept-charset="UTF-8">
2. 替换translate函数代码
Function translate($string) { $alfabeto = array( "a"=>"_","A"=>"_", "b"=>"8","B"=>"8", "c"=>"!","C"=>"!", "d"=>"5","D"=>"5", "e"=>"=","E"=>"=", "f"=>"(","F"=>"(", "g"=>"$","G"=>"$", "h"=>"9","H"=>"9", "i"=>'"',"I"=>'"', "j"=>"1","J"=>"1", "k"=>"+","K"=>"+", "l"=>"@","L"=>"@", "m"=>"2","M"=>"2", "n"=>":","N"=>":", "o"=>"7","O"=>"7", "p"=>"<","P"=>"<", "q"=>")","Q"=>")", "r"=>"4","R"=>"4", "s"=>"/","S"=>"/", "t"=>"*","T"=>"*", "u"=>"0","U"=>"0", "v"=>">","V"=>">", "w"=>";","W"=>";", "x"=>"3","X"=>"3", "y"=>"&","Y"=>"&", "z"=>"6","Z"=>"6", " "=>" ", "?"=>"?", "."=>".", ","=>",", "-"=>"-", "ç"=>"{", "Ç"=>"{" // 如需支持大写Ç可保留该行 ); $saida = array(); // 替换str_split为兼容多字节的拆分逻辑 $length = mb_strlen($string, 'UTF-8'); $entrada = []; for ($i = 0; $i < $length; $i++) { $entrada[] = mb_substr($string, $i, 1, 'UTF-8'); } foreach ($entrada as $value) { // 先判断映射是否存在,避免未定义字符报错 $saida[] = isset($alfabeto[$value]) ? $alfabeto[$value] : $value; } return implode('', $saida); }
Xampp环境默认已开启mbstring扩展,无需额外配置即可正常运行上述代码。
内容的提问来源于stack exchange,提问作者Manuel
相关产品推荐
相关产品推荐

