Laravel 8 中“设置 Encoding”实为两层:Accept-Encoding 控制 gzip/br 压缩自动解压,需设 CURLOPT_ACCEPT_ENCODING;字符集防乱码靠 Content-Type 中的 charset 声明及响应后 mb_convert_encoding 转码。

在 Laravel 8 中,cURL 并不是框架原生调用的组件,而是底层 PHP 的扩展。当你用 Http Facade(如 Http::post())或手动使用 curl_init() 发起请求时,“设置 Encoding”实际涉及两个不同层面:一是**声明客户端支持的响应压缩编码(Accept-Encoding)**,二是**确保字符集(charset)正确传递与解析**。两者常被混淆,但作用完全不同。
明确 Accept-Encoding:让服务端返回 gzip/br 压缩响应
如果你希望 Laravel(或其底层 cURL)自动接收并解压 gzip、br 等压缩响应,需显式启用 libcurl 的 CURLOPT_ACCEPT_ENCODING 选项:
- 传入空字符串
""或编码列表(如"gzip, deflate, br"),libcurl 就会发送Accept-Encoding: gzip, deflate, br请求头,并在收到Content-Encoding: gzip等响应时自动解压内容; - 传入
NULL(默认值)则完全禁用该功能——不发头、不解压; - 注意:
CURLOPT_ENCODING是过时别名,PHP 官方文档已标记为 deprecated,应避免使用; - 若你用的是
HttpFacade,它底层不暴露此选项,需切换到原生 cURL 或改用 Guzzle(Guzzle 默认开启 gzip 解压)。
设置字符集(Charset):防止乱码的关键
“Encoding”常被误理解为 UTF-8 字符集,但这和 HTTP 压缩无关。要避免响应乱码,重点是:
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
- 在请求头中声明你期望的字符集,例如:
Content-Type: application/json; charset=UTF-8(适用于 POST/PUT 请求体); - 不依赖
CURLOPT_ENCODING来指定 UTF-8——它对字符集无效; - 响应返回后,检查
Content-Type头中的charset值(可用curl_getinfo($ch, CURLINFO_CONTENT_TYPE)获取),再用mb_convert_encoding()或iconv()转为目标编码; - Laravel 自带的
HttpFacade 返回的响应体默认按 UTF-8 处理,但若服务端返回 GBK 且未声明 charset,仍可能乱码,此时需手动检测转换。
推荐做法:优先用 Http Facade + 显式头控制
在 Laravel 8 中,比手写 cURL 更安全、简洁的方式是使用 Illuminate\Support\Facades\Http:
- 它默认发送
Accept-Encoding: gzip,自动解压响应; - 可通过
->withHeaders(['Content-Type' => 'application/json; charset=UTF-8'])设置请求字符集; - 响应体直接为字符串,无需手动解压,字符集处理也更稳定;
- 如需精细控制压缩行为(如禁用 gzip 或加 br),可搭配 Guzzle,或退回到原生 cURL 并设置
CURLOPT_ACCEPT_ENCODING为具体字符串。
不复杂但容易忽略:Accept-Encoding 是压缩协商机制,不是字符集开关;真正影响中文显示的是 Content-Type 中的 charset 和后续转码逻辑。

















