中文乱码现象 PHP 对接语音通知时常见问题:接口返回成功,但被叫听到的播报变成乱码或问号。这通常是请求过程中编码被破坏,接口要求 content 以 UTF-8 传输,任何环节转换都会导致 TTS 合成异常,甚至播报错字。 一、根因分析…
中文乱码现象
PHP 对接语音通知时常见问题:接口返回成功,但被叫听到的播报变成乱码或问号。这通常是请求过程中编码被破坏,接口要求 content 以 UTF-8 传输,任何环节转换都会导致 TTS 合成异常,甚至播报错字。
一、根因分析
- PHP 文件保存为 GBK 而非 UTF-8;
- 数据库连接未设 UTF-8,读出的中文已乱码;
- curl 未指定编码头或 content 未做 URL 编码;
- 页面 BOM 头污染了字符串内容。
二、解决方案
1. 统一 UTF-8 编码
文件以 UTF-8 无 BOM 保存,数据库连接后执行 mysqli_set_charset($conn,'utf8mb4'),确保取出的中文本身就是 UTF-8,从源头避免污染。
2. curl 设置编码头
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/x-www-form-urlencoded;charset=utf-8'
]);
3. content 参数 URL 编码
$post = http_build_query([
'account'=>$apiId,'password'=>$apiKey,
'mobile'=>$mobile,'content'=>'您的验证码为1234'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
用 http_build_query 自动对中文做 URL 编码,避免手动拼接丢字符。
三、验证方法
- 先用 10 条免费额度拨打测试号码;
- 打印 post 字符串,确认中文变成 %E6 编码;
- 接听电话核对播报是否与原文一致;
- 仍乱码则检查文件编码与数据库字符集。