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

如何强制AWS SNS使用ASCII或GSM编码发送长短信(Go语言)

解决AWS SNS强制使用ASCII/GSM-7编码发送短信的问题

嘿,我来帮你搞定这个AWS SNS短信编码的问题!你遇到的系统始终选UC-2导致消息拆分的情况,要么是消息内容里藏着GSM-7/ASCII不支持的字符,要么是SNS的自动检测没精准识别,下面是具体的解决步骤:

1. 先排查消息内容的兼容性

首先得确认你的content里有没有GSM-7不支持的字符——哪怕一个都能触发UC-2编码。比如这些常见的“坑”:

  • 特殊符号:像€、长破折号—、智能引号“”这类
  • 非西欧字符:中文、日文,或者带特殊重音的欧洲字符
    GSM-7包含所有ASCII字符和大部分西欧常用字符,你可以对照GSM-7字符列表检查内容,有不兼容的就替换成兼容版本。

2. 用MessageAttributes强制指定编码

如果你的内容确实全是GSM-7兼容字符,但SNS还是“固执”选UC-2,那直接在Publish请求里加MessageAttributes手动指定编码就行。AWS SNS支持通过AWS.SNS.SMS.Encoding属性设置编码,可选值是"GSM"或"UNICODE"。

修改你的Go代码如下:

svc := sns.New(newSession())

// 构建消息属性,强制使用GSM编码(兼容ASCII)
messageAttrs := map[string]*sns.MessageAttributeValue{
    "AWS.SNS.SMS.Encoding": {
        DataType:    aws.String("String"),
        StringValue: aws.String("GSM"),
    },
}

publishInput := &sns.PublishInput{
    Message:           aws.String(content),
    PhoneNumber:       aws.String("你的目标手机号"), // 替换成实际手机号
    MessageAttributes: messageAttrs,
}

if _, err = svc.Publish(publishInput); err != nil {
    // 这里处理错误逻辑
    log.Printf("发送短信失败: %v", err)
}

3. 额外注意事项

  • 要是强制指定GSM编码,但内容里有不兼容字符,SNS会直接返回错误,所以一定要确保内容完全符合GSM-7规范
  • ASCII是GSM-7的子集,指定GSM编码完全能覆盖ASCII内容,还能享受到160字符的单条短信容量
  • 如果你严格只需要ASCII编码(仅0-127的ASCII字符),用上面的方法指定GSM就够了,不会触发UC-2

这样调整后,SNS就会按照你指定的编码处理短信,不会再随便拆分消息啦!

内容的提问来源于stack exchange,提问作者André G. Andrade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:30:16