运维监控

PHP 对接语音通知遇到中文乱码怎么解决

文章详情

中文乱码现象 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 编码,避免手动拼接丢字符。

三、验证方法

  1. 先用 10 条免费额度拨打测试号码;
  2. 打印 post 字符串,确认中文变成 %E6 编码;
  3. 接听电话核对播报是否与原文一致;
  4. 仍乱码则检查文件编码与数据库字符集。

PHP DEMO 见代码示例页面,参数见接口文档

立即开始使用语音通知 API

注册送10条调试额度 · 3分钟快速接入 · 免费技术支持