Laravel提交utf8字符®被转ASCII,如何让$request接收utf8原值?
你遇到的是UTF-8字符被错误解析为ISO-8859-1编码的典型问题,®的UTF-8编码为0xC2 0xAE,当系统将这两个字节按单字节编码ISO-8859-1解析时,就会分别对应字符Â和®,也就是你看到的异常内容。
解决方案
1. 校验表单标签配置
确认提交数据的form标签添加了accept-charset属性,强制指定提交编码为UTF-8:
<form method="POST" action="/你的路由地址" accept-charset="UTF-8"> <!-- 原有input表单内容 --> </form>
省略该属性时部分浏览器会按照操作系统默认编码提交表单,容易和页面声明的UTF-8编码冲突。
2. 校验Laravel基础配置
打开config/app.php文件,确认charset配置项值为utf-8,Laravel 5.8版本默认是该值,若被手动修改需要改回:
'charset' => 'utf-8',
3. 排除中间件篡改请求
检查是否自定义了请求处理中间件,有没有对请求参数做过htmlentities、utf8_encode等编码操作,或者引入的第三方扩展包修改了请求参数编码。你可以在app/Http/Kernel.php中临时注释非系统自带的中间件,验证问题是否消失。
4. 确认输出环节无编码问题
直接打印响应返回的内容显示异常,有可能是输出响应的编码配置错误而非请求接收时的问题,可做如下验证:
- 将请求获取的参数直接写入本地txt文件,打开文件查看字符是否正常
- 控制器返回响应时强制指定编码:
return response($request->input('field'), 200, ['Content-Type' => 'text/html; charset=utf-8']);
5. 校验服务器配置
如果用Nginx做服务容器,打开站点配置文件,确认添加了如下配置:
charset utf-8; add_header Content-Type text/html; charset=utf-8;
修改后重启Nginx生效。
临时兼容方案
如果暂时无法定位根因,可以用编码转换函数手动修正参数:
$fixedField = mb_convert_encoding($request->input('field'), 'ISO-8859-1', 'UTF-8'); // 或者 $fixedField = utf8_decode($request->input('field'));
内容的提问来源于stack exchange,提问作者Dom DaFonte
相关产品推荐
相关产品推荐

