You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Asterisk中Unicode变量及Caller-ID-Name乱码问题咨询与修复

Asterisk Unicode乱码修复与变量初始化差异解析

问题重现

用户拨号计划代码:

exten => p111,1, NoOp(********** test unicode char ************);
same => n,Answer();
same => n,Set(myVariable="امین رستمی")
same => n,NoOp(******** #2 ${myVariable}***************);
same => n,Hangup();

执行后myVariable显示为???? ?????;通过AsterNET AGI从数据库读取联系人姓名设置为caller-id-name时同样乱码,但Asterisk电话本中的Unicode内容显示正常。

乱码核心原因

Asterisk默认字符编码为ISO-8859-1(Latin-1),不支持UTF-8 Unicode字符。乱码本质是编码链路不一致:

  • 拨号计划文件编码与Asterisk解析编码不匹配
  • AGI链路(数据库→脚本→Asterisk)未统一使用UTF-8
  • 终端控制台编码未同步为UTF-8(仅影响日志显示)

修复步骤

1. 配置Asterisk全局UTF-8编码

修改asterisk.conf,在[options]段添加:

charset=utf8

或在extensions.conf开头的全局段设置:

[globals]
SET(GLOBAL(charset)=utf8)
SET(CHANNEL(language)=fa) ; 针对波斯语设置语言编码,可选但建议

2. 确保配置文件编码为UTF-8

将extensions.conf等相关配置文件保存为UTF-8无BOM格式,避免Asterisk读取时出现编码转换错误。

3. 统一AGI链路编码(AsterNET + 数据库)

  • 数据库端:确保数据库表字符集为utf8mb4,连接字符串指定UTF-8编码(如MySQL连接参数添加characterEncoding=utf8mb4)。
  • AsterNET脚本端:从数据库读取数据后直接保留UTF-8格式,无需额外转码;发送AGI命令设置CALLERID(name)时,确保AsterNET用UTF-8编码传递参数。

4. 验证终端编码

使用asterisk -rvvv查看日志时,确保终端(SSH/控制台)字符编码设置为UTF-8,避免本地显示乱码。

变量初始化方式的差异

初始化方式编码依赖点出错风险
拨号计划直接Set依赖配置文件编码 + Asterisk全局charset设置中(仅需两个环节一致)
Asterisk电话本存储内置存储(astdb/voicemail)默认支持UTF-8,或电话本文件本身为UTF-8编码低(Asterisk原生适配)
AGI动态从数据库读取设置需同步数据库编码、AGI脚本编码、Asterisk编码三个环节,链路更长高(任一环节不匹配即乱码)

内容的提问来源于stack exchange,提问作者AminRostami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:05:30