PHP数组中特殊字符键存在却无法查询匹配的原因及解决方法
问题原因
- 核心原因是你使用了
str_split()函数分割输入字符串:str_split()默认按单字节切割字符,而♧、☆这类特殊符号都是多字节UTF-8字符(通常占2-3字节),会被拆成多个独立的乱码单字节片段,自然无法匹配数组里的完整字符键。 - 次要潜在问题:如果你的PHP源码文件没有保存为UTF-8无BOM格式,或者前端传入的
inputText参数编码不是UTF-8,也会导致字符编码不匹配,无法命中数组键。
修复方案
- 把
str_split替换为多字节安全的分割方式,优先使用PHP 7.4+内置的mb_str_split()函数,同时显式指定编码为UTF-8 - 增加键存在判断,避免未定义的字符触发PHP警告
- 确认PHP源码文件保存为UTF-8无BOM格式,前端传入参数的编码也统一为UTF-8
修改后的完整代码如下:
<?php $default = [ "0" => "000a ", "1" => "000b ", "2" => "000c ", "3" => "000d ", "4" => "000e ", "5" => "000f ", "6" => "000g ", "7" => "000h ", "8" => "000i ", "9" => "000j ", "a" => "001a ", "A" => "002a ", "b" => "003a ", "B" => "004a ", "c" => "005a ", "C" => "006a ", "d" => "007a ", "D" => "008a ", "e" => "009a ", "E" => "010a ", "f" => "011a ", "F" => "012a ", "g" => "013a ", "G" => "014a ", "h" => "015a ", "H" => "016a ", "i" => "017a ", "I" => "018a ", "j" => "019a ", "J" => "020a ", "k" => "021a ", "K" => "022a ", "l" => "023a ", "L" => "024a ", "m" => "025a ", "M" => "026a ", "n" => "027a ", "N" => "028a ", "o" => "029a ", "O" => "030a ", "p" => "031a ", "P" => "032a ", "q" => "033a ", "Q" => "034a ", "r" => "035a ", "R" => "036a ", "s" => "037a ", "S" => "038a ", "t" => "039a ", "T" => "040a ", "u" => "041a ", "U" => "042a ", "v" => "043a ", "V" => "044a ", "w" => "045a ", "W" => "046a ", "x" => "047a ", "X" => "048a ", "y" => "049a ", "Y" => "050a ", "z" => "051a ", "Z" => "052a ", "!" => "053a ", "?" => "054a ", "," => "055a ", "." => "056a ", "_" => "057a ", "(" => "058a ", ")" => "059a ", "$" => "060a ", " " => "061a ", "/" => "062a ", "=" => "063a ", "#" => "064a ", "@" => "065a ", "%" => "066a ", "^" => "067a ", "&" => "068a ", "*" => "069a ", "-" => "070a ", "'" => "071a ", '"' => "072a ", ":" => "073a ", ";" => "074a ", "+" => "075a ", "×" => "076a ", "÷" => "077a ", "€" => "078a ", "£" => "079a ", "¥" => "080a ", "₩" => "081a ", "`" => "082a ", "~" => "083a ", "\\" => "084a ", "|" => "085a ", "<" => "086a ", ">" => "087a ", "{" => "088a ", "}" => "089a ", "[" => "090a ", "]" => "091a ", "▪︎" => "092a ", "○" => "093a ", "●" => "094a ", "□" => "095a ", "■" => "096a ", "♤" => "097a ", "♡" => "098a ", "◇" => "099a ", "♧" => "100a ", "☆" => "101a ", "⊙" => "102a ", "°" => "103a ", "•" => "104a ", "¤" => "105a ", "《" => "106a ", "》" => "107a ", "¡" => "108a ", "¿" => "109a ", "₽" => "110a ", "а" => "111a " ]; $converted = ''; // 显式指定全局编码为UTF-8,避免编码混乱 mb_internal_encoding('UTF-8'); $inputText = $_GET['inputText'] ?? ''; // 替换为多字节安全的分割函数 foreach (mb_str_split($inputText) as $val) { // 增加键存在判断,避免未定义字符报错 if (isset($default[$val])) { $converted .= $default[$val]; } } echo $converted; ?>
如果你的PHP版本低于7.4,没有内置mb_str_split函数,可以先在代码开头添加以下自定义兼容函数:
function mb_str_split($string, $length = 1) { $result = []; $len = mb_strlen($string); for ($i = 0; $i < $len; $i += $length) { $result[] = mb_substr($string, $i, $length); } return $result; }
内容的提问来源于stack exchange,提问作者AndreasMelone
相关产品推荐
相关产品推荐

