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

无法配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:35:18