ISO字符集与UTF-8编码问题:$_REQUEST获取特殊字符异常
问题原因与解决方案
核心原因:编码混淆+自动转义
你遇到的是Windows-1252与ISO-8859-1(Latin-1)编码不匹配导致的字符映射错误,再叠加了自动HTML实体转义的效果:
- 输入的
Œ、œ、Ÿ、€这些字符属于Windows-1252编码的扩展ASCII范围(0x80-0x9F),而ISO-8859-1里这个区间是未定义的控制字符。当表单以Windows-1252编码提交,但PHP用ISO-8859-1解析$_REQUEST参数时,这些字节会被错误映射成ISO-8859-1的可见字符:0x80→¤、0x8C→¼、0x9C→½、0x9F→¾,完全对应你看到的输出。 - 而
…、≤、≥等字符变成HTML实体(比如…),是因为服务器或框架对请求参数自动执行了htmlspecialchars/htmlentities转义,把Unicode字符转换成了HTML实体格式。
修复步骤
统一编码为UTF-8(推荐)
- 在提交表单的HTML页面头部添加:
<meta charset="UTF-8">,确保表单以UTF-8编码提交。 - 在PHP脚本开头设置响应编码:
header('Content-Type: text/html; charset=UTF-8');,同时修改php.ini配置:default_charset = "UTF-8",让PHP默认用UTF-8解析请求和输出。
- 在提交表单的HTML页面头部添加:
修复已错误解析的字符
若暂时无法切换UTF-8,可将错误解析的字符串从ISO-8859-1转成Windows-1252再转UTF-8:$fixed_value = mb_convert_encoding($_REQUEST['some_value'], 'UTF-8', 'Windows-1252');关闭/还原自动转义
- 若因旧版PHP的
magic_quotes_gpc导致转义,可在脚本开头处理:if (get_magic_quotes_gpc()) { $_REQUEST['some_value'] = stripslashes($_REQUEST['some_value']); } - 若为自动HTML实体转义,用
html_entity_decode还原:$decoded_value = html_entity_decode($_REQUEST['some_value'], ENT_QUOTES, 'UTF-8');
- 若因旧版PHP的
内容的提问来源于stack exchange,提问作者Joshua Juan
相关产品推荐
相关产品推荐

