PHP中解码含\x且编码值超255的字符串问题求助
PHP字符串解码解决方案
问题分析
你提供的PHP字符串中,\xce\xbb这类转义序列是目标字符的UTF-8字节,但PHP双引号会将其解析为ISO-8859-1(Latin-1)编码的字符。之前使用utf8_encode(utf8_encode($str))是错误的——该函数仅用于将ISO-8859-1转成UTF-8,两次转码会导致字节序列混乱,无法得到正确结果。
正确解决方法
以下几种方式均可实现需求:
方法1:直接输出并设置UTF-8编码
PHP字符串本质是字节流,你的$str已经包含了目标字符的UTF-8字节序列,只需确保输出时的字符集为UTF-8即可:
header('Content-Type: text/html; charset=utf-8'); $str = "\xce\xbb\xc6\x9b\xc2\xac\xe2\x88\xa7\xe2\x9f\x91\xe2\x88\xa8\xe2\x9f\x87\xc3\xb7 \xe2\x82\xac\xc2\xbd\xe2\x88\x86\xc3\xb8\xe2\x86\x94\xc2\xa2\xe2\x8c\x90\xc3\xa6"; echo $str;
方法2:使用mb_convert_encoding转码
将解析后的ISO-8859-1字符串转换为UTF-8(等价于把原始字节序列按UTF-8解码):
header('Content-Type: text/html; charset=utf-8'); $str = "\xce\xbb\xc6\x9b\xc2\xac\xe2\x88\xa7\xe2\x9f\x91\xe2\x88\xa8\xe2\x9f\x87\xc3\xb7 \xe2\x82\xac\xc2\xbd\xe2\x88\x86\xc3\xb8\xe2\x86\x94\xc2\xa2\xe2\x8c\x90\xc3\xa6"; $decoded = mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1'); echo $decoded;
方法3:从十六进制序列还原字节
如果字符串是以十六进制转义形式存储的,可以先去除\x前缀,再将十六进制字符串转为字节序列:
header('Content-Type: text/html; charset=utf-8'); $hexRaw = '\xce\xbb\xc6\x9b\xc2\xac\xe2\x88\xa7\xe2\x9f\x91\xe2\x88\xa8\xe2\x9f\x87\xc3\xb7 \xe2\x82\xac\xc2\xbd\xe2\x88\x86\xc3\xb8\xe2\x86\x94\xc2\xa2\xe2\x8c\x90\xc3\xa6'; $hexStr = str_replace('\x', '', $hexRaw); $str = hex2bin($hexStr); echo $str;
以上三种方法均可输出预期结果:λƛ¬∧⟑∨⟇÷ €½∆ø↔¢⌐æ
内容的提问来源于stack exchange,提问作者touka
相关产品推荐
相关产品推荐

