使用Java的SMSlib发送阿拉伯语短信问题求助
解决SMSlib发送阿拉伯语显示空格的问题
我之前也踩过SMSlib处理非拉丁字符的坑,阿拉伯语显示成空格基本都是编码不匹配或者短信模式没配置对导致的,给你几个实用的排查和解决步骤:
1. 强制使用UCS2编码(核心解决点)
SMSlib默认采用GSM 7-bit编码,而阿拉伯语字符不在这个编码的覆盖范围内,必须强制切换到UCS2编码(Unicode的一种短信兼容格式)。
在创建OutboundMessage后,添加这行代码:
message.setEncoding(MessageEncodings.ENCUCS2);
如果你的项目里找不到MessageEncodings枚举,也可以直接用对应的数值(UCS2的编码标识是1):
message.setEncoding(1);
2. 启用PDU模式
很多Modem默认用TEXT模式发送短信,这种模式不支持UCS2编码的非拉丁字符,必须切换到PDU模式。初始化网关时添加这行:
gateway.setProtocol(Protocols.PDU);
3. 确保字符集传递正确
检查你的阿拉伯语字符串是否是正确的Unicode格式:
- 如果是从文件/数据库读取,一定要指定UTF-8字符集,比如:
String arabicContent = new String(Files.readAllBytes(Paths.get("arabic.txt")), StandardCharsets.UTF_8); - 直接硬编码的话,确保IDE的文件编码是UTF-8,避免编译时字符丢失。
4. 验证运营商和Modem支持
- 有些运营商可能默认关闭Unicode短信支持,建议先换个支持的运营商SIM卡测试,或者联系运营商确认权限。
- 部分老旧Modem可能需要手动发送AT指令开启Unicode支持,比如在网关初始化后执行:
gateway.sendATCommand("AT+CSCS=\"UCS2\"", 1000); gateway.sendATCommand("AT+CMGF=0", 1000); // 再次确认PDU模式
完整示例代码
这里给你一个可以直接参考的完整发送阿拉伯语短信的代码:
import org.smslib.AGateway; import org.smslib.IOutboundMessageNotification; import org.smslib.Library; import org.smslib.Message; import org.smslib.MessageEncodings; import org.smslib.OutboundMessage; import org.smslib.Service; import org.smslib.modem.SerialModemGateway; import org.smslib.modem.Protocols; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; public class ArabicSMSHandler { public static void main(String[] args) throws Exception { // 监听发送状态 IOutboundMessageNotification outboundNotifier = (gateway, msg) -> System.out.printf("短信从网关[%s]发出,状态:%s%n", gateway.getGatewayId(), msg.getStatus()); Service smsService = Service.getInstance(); smsService.setOutboundMessageNotification(outboundNotifier); // 初始化Modem网关(根据你的设备修改端口、波特率、品牌) SerialModemGateway modemGateway = new SerialModemGateway("myModem", "COM3", 115200, "Huawei", ""); modemGateway.setInbound(true); modemGateway.setOutbound(true); modemGateway.setSimPin("1234"); // 替换你的SIM卡PIN modemGateway.setProtocol(Protocols.PDU); // 强制PDU模式 smsService.addGateway(modemGateway); smsService.startService(); System.out.println("SMS服务启动,版本:" + Library.getLibraryDescription()); // 准备阿拉伯语内容 String arabicText = "مرحبا، هذا رسالة عربية من SMSlib!"; // 如果是从文件读取: // String arabicText = new String(Files.readAllBytes(Paths.get("arabic_content.txt")), StandardCharsets.UTF_8); OutboundMessage arabicMsg = new OutboundMessage("+966xxxxxxxxx", arabicText); arabicMsg.setEncoding(MessageEncodings.ENCUCS2); // 设置UCS2编码 // 发送短信 smsService.sendMessage(arabicMsg); System.out.println("短信已发送,ID:" + arabicMsg.getMsgId()); smsService.stopService(); } }
额外排查点
- 升级SMSlib到最新稳定版:旧版本可能存在非拉丁字符的兼容bug,建议用v3.5.4及以上版本。
- 测试短内容:先发送短的阿拉伯语句子,排除长短信拆分带来的编码问题。
内容的提问来源于stack exchange,提问作者M.Bourouffala
相关产品推荐
相关产品推荐

