无法配置Apache Camel SMPP接收SMSC节点GSM-7编码短信
Apache Camel SMPP 4.2.0 与 GSM-7 编码异常解决经验
问题背景
使用camel-smpp-starter 4.2.0对接SMSC,对方通过消息头指定默认字母表为GSM-7,但配置组件的encoding为GSM-7时,抛出UnsupportedEncodingException异常。查看源码发现组件通过String(body, encoding)方法解码短信内容,而Java不识别"GSM-7"这个字符集名称。
配置与异常信息
配置代码
camel: springboot: main-run-controller: true component: enabled: true smpp: encoding: GSM-7
异常信息
2024-01-29T07:33:26.154+01:00 WARN 11636 --- [pool-2-thread-1] o.a.camel.component.smpp.SmppConsumer : Cannot create exchange. This exception will be ignored.. Caused by: [java.io.UnsupportedEncodingException - GSM-7] java.io.UnsupportedEncodingException: GSM-7 at java.base/java.lang.String.lookupCharset(String.java:861) ~[na:na] at java.base/java.lang.String.<init>(String.java:1401) ~[na:na] at org.apache.camel.component.smpp.SmppUtils.decodeBody(SmppUtils.java:372)
解决方案
替换为Java支持的字符集名称
Java中GSM-7对应的标准字符集别名是GSM0338,将配置中的encoding: GSM-7修改为:
camel: # ...其他配置 smpp: encoding: GSM0338
修改后组件能正确调用String(body, "GSM0338")完成解码,避免异常。
处理扩展GSM-7字符
如果SMSC发送的短信包含扩展GSM-7字符(如€、换行符等),这些字符在GSM-7中需要用转义序列表示。Camel SMPP 4.2.0版本默认会处理基础GSM-7字符,但扩展字符可能需要额外配置或手动处理:
- 确认SMSC是否启用了扩展字符支持
- 在路由中可以通过自定义处理器,使用
GSM0338对应的工具类来解码扩展字符。
自定义解码逻辑(可选)
如果默认解码逻辑不满足需求,可以在路由中手动处理短信内容:
from("smpp://...") .process(exchange -> { byte[] body = exchange.getIn().getBody(byte[].class); // 使用GSM0338解码 String decoded = new String(body, "GSM0338"); exchange.getIn().setBody(decoded); }) .to("...");
注意事项
- 先确认SMSC实际发送的字节流确实是GSM-7编码,避免字符集不匹配导致乱码
- 测试特殊字符(如@、£、€等)的解码效果,确保显示正确
内容的提问来源于stack exchange,提问作者Jesper
相关产品推荐
相关产品推荐

