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
相关产品推荐
相关产品推荐

