PHP使用SMPP包发送短信时UTF8字符破损乱码问题求助
原因分析
你当前使用的GsmEncoder::utf8_to_gsm0338方法生成的GSM 03.38编码仅支持拉丁字母、部分欧洲语言字符及少量符号,完全不兼容缅甸语(myn)字符,转码过程中就会丢失不被支持的字符,最终导致收到的短信出现乱码。
解决方案
需要更换为SMPP协议中对非GSM字符集通用的UCS2(即UTF-16BE)编码,同时指定对应的编码标识,修改代码如下:
- 替换编码逻辑:
// 无需转GSM 03.38,直接将UTF-8的缅甸语内容转为UCS2编码 $encodedMessage = mb_convert_encoding($message, 'UTF-16BE', 'UTF-8');
- 调用
sendSMS方法时指定data_coding参数为8(对应UCS2编码):
// 第六个参数为data_coding,设为8即可告知SMPP中心按UCS2解码内容 $smpp->sendSMS($from, $to, $encodedMessage, null, null, 8);
注意事项
- UCS2编码的单条短信最多支持70个字符,若内容长度超过限制,需要按长短信规则拆分,常用的SMPP扩展包通常会自动处理该逻辑,若你的包无自动拆分能力需自行实现,避免超长部分丢失或乱码。
- 提前确认你的SMPP服务运营商支持UCS2编码,绝大多数主流运营商均默认支持,部分小众地区可能需要单独开通对应权限。
内容的提问来源于stack exchange,提问作者user16925455
相关产品推荐
相关产品推荐

