php 8.1 调用 deepseek api 返回乱码的根本原因是 utf-8 编码在请求头、请求体、响应解析、客户端解码四环节未全程对齐;需显式设置 content-type 和 accept-charset 为 utf-8,校验并转换请求体编码,清除 bom 后强制转 utf-8 再解析 json。

PHP 8.1 调用 DeepSeek API 返回乱码,核心原因是请求与响应的字符编码未全程对齐——不是 PHP 版本问题,而是 UTF-8 编码在请求头、请求体、响应解析、客户端解码四个环节中某一处断裂所致。
检查并强制设置请求头为 UTF-8
DeepSeek API 默认期望 UTF-8,但若请求头缺失明确声明,部分中间层(如代理、网关)可能降级处理。
- 使用 cURL 时,必须显式添加两个关键头:
Content-Type: application/json; charset=utf-8Accept-Charset: utf-8 - PHP 示例代码中确保这样写:
curl_setopt($ch, CURLOPT_HTTPHEADER, [<br> 'Content-Type: application/json; charset=utf-8',<br> 'Accept-Charset: utf-8'<br>]);
- 避免只写
application/json—— 少了charset=utf-8,服务端可能按 ISO-8859-1 解析中文字段,返回损坏字节。
验证请求体字符串是合法 UTF-8
即使头正确,如果 JSON 字符串本身含非法字节(比如从 GBK 文件读入未转码的中文),DeepSeek 会原样回传,PHP 解析时就显示 □ 或 。
- 构造 JSON 前,对所有输入字符串做 UTF-8 校验:
$safe_str = mb_convert_encoding($input, 'UTF-8', 'UTF-8');
或更严格地:if (!mb_check_encoding($input, 'UTF-8')) {<br> $input = mb_convert_encoding($input, 'UTF-8', 'auto');<br>} - 特别注意:从数据库、文件、表单读取的数据,需单独确认编码;不要依赖
mb_detect_encoding()判断,它不可靠,应以数据来源为准。
强制响应内容按 UTF-8 解码
PHP 的 curl_exec() 返回的是原始字节流,不自动解码。若响应头未带 charset=utf-8,json_decode() 可能误判。
- 获取响应后,先清除可能的 BOM:
$raw = preg_replace('/^\xEF\xBB\xBF/', '', $raw); - 再用
mb_convert_encoding()统一转为 UTF-8:$utf8_content = mb_convert_encoding($raw, 'UTF-8', 'UTF-8');
(即使已是 UTF-8,该调用也安全,且可过滤无效序列) - 最后解析:
$data = json_decode($utf8_content, true);
补充:确认 DeepSeek 响应头真实编码
有些情况下,DeepSeek 实际返回的是 UTF-8,但响应头漏写了 charset,导致 PHP 客户端“猜错”。
- 开启 cURL header 获取:
curl_setopt($ch, CURLOPT_HEADER, true);
然后用curl_getinfo($ch, CURLINFO_HEADER_SIZE)分离头与体。 - 检查响应头中
Content-Type是否含charset=utf-8;若没有,不能依赖自动识别,必须手动解码。 - 必要时用
bin2hex(substr($raw, 0, 6))查看前几个字节,确认是否为标准 UTF-8 中文(如e4bda0是「你」),排除服务端真返回 GBK 的可能。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











