SMS 字符限制与分段计数
每条 SMS 都以固定大小的单元(称为段)来承载。每段是一个计费单位,因此消息长度直接影响费用。一段能容纳多少字符取决于 Bird 为消息体选择的编码,而仅一个超出默认字母表的字符就可能使容量减半。
编码的选择方式
Bird 在发送前会检查消息体中的每个字符:
- 如果所有字符都属于 GSM-7 字母表(GSM 03.38 定义的标准 7 位字符集),消息使用 GSM-7 编码。
- 如果有任何一个字符不属于 GSM-7,整条消息将切换为 UCS-2(16 位 Unicode 编码)。
Bird 不会在一条消息中混合使用编码。一个 emoji、一个中日韩字符或一个弯引号都会使整个消息体转换为 UCS-2。
分段限制
| 编码 | 单段 | 每段(多段消息) |
|---|---|---|
| GSM-7 | 160 个七位组 | 153 个七位组 |
| UCS-2 | 70 个 UTF-16 码元 | 67 个 UTF-16 码元 |
当消息长于一段时,会被拆分为多段。每个多段消息段会预留几个字节用于重组头(称为 User Data Header),这将 GSM-7 的容量从 160 降至 153,UCS-2 的容量从 70 降至 67。
一条占用 161 个七位组的 GSM-7 消息需要 2 段(ceil(161 / 153) = 2)。拆分会将编码后的消息体分布在两段中,每段可容纳 153 个七位组。
最大消息长度
Bird 每条消息最多接受 12 段,对应:
- GSM-7:1,836 个七位组(12 × 153)
- UCS-2:804 个 UTF-16 码元(12 × 67)
超过 12 段的消息体会被拒绝并返回 422 错误。Bird 不会静默截断消息。
GSM-7 字符集
GSM-7 涵盖大多数拉丁文消息所需的字符:
- 字母 A-Z、a-z
- 数字 0-9
- 常用标点:@、£、$、!、"、#、%、&、'、(、)、*、+、,、-、.、/、:、;、<、=、>、?、空格、换行
- 一些西欧语言的重音字符,包括 café 中的 é
扩展表字符
少数字符属于 GSM-7,但位于扩展表中。每个字符占用 2 个七位组 而非 1 个,因此在分段限制中按双倍计算:
€、[、]、{、}、\、~、^、|
这在边界情况下非常重要。如果你写了 159 个普通字符后跟一个欧元符号,编码大小为 161 个七位组(159 + 2),即使看起来是 160 个字符,也会被推入 2 段。
触发 UCS-2 的字符
GSM 03.38 以外的任何字符都会强制整条消息使用 UCS-2。最常见的触发字符包括:
- Emoji:许多基本多文种平面之外的 emoji 使用两个 UTF-16 码元。35 个这样的 emoji 可以放入一段;第 36 个会使消息变为两段。一个可见的 emoji 还可能由多个码点组合而成,因此应计算编码后的消息体而非可见符号数。
- 中日韩字符(中文、日文、韩文)
- 阿拉伯文、泰文、印地文以及 GSM-7 字母表之外的其他文字
- 弯引号(智能引号):“ ” ‘ ’(直引号版本 " 和 ' 属于 GSM-7)。智能编码可以在发送前替换这些字符。
一些重音拉丁字符,包括 café 和 ü 中的 é,属于 GSM-7 字符集,不会触发 UCS-2。其他字符,包括 á、í 和 ú,会触发 UCS-2。
智能编码
一些 UCS-2 触发字符并非你主动输入:文字处理器将 ' 替换为 ’,粘贴时带入长破折号,表单字段中携带不间断空格。发送时将 options.smart_encoding 设为 true,Bird 会在消息发出前将这些字符替换为对应的 GSM-7 等价字符,从而保持消息体使用 GSM-7 编码,并可能使段数减半。
智能编码默认关闭,仅在替换后所有剩余字符都可以使用 GSM-7 时才生效。如果替换后消息体中仍包含 GSM-7 之外的字符(例如 emoji 或不支持的重音字母),Bird 会按原样发送。智能编码涵盖了替换表及如何读取结果。
从 API 读取分段计数
每个 SMS 响应都包含一个 segments 对象,报告 Bird 的计算结果:
代码示例
{
"segments": {
"count": 1,
"encoding": "GSM_7BIT",
"characters": 64
}
}- count:计费段数
- encoding:GSM_7BIT 或 UCS2
- characters:消息体中的字符数(Unicode 码点)
count 表示计费段数。在响应或 SMS 日志中查看该数值,确认段数是否符合预期。
将消息控制在一段以内
以下几个习惯可以避免意外产生多段发送:
- 将弯引号替换为直引号。文字处理器和某些手机会自动将 " 替换为 “ ”,这会强制使用 UCS-2 并使容量减半。智能编码会在你启用的发送中自动完成此替换。
- 在事务性或身份验证消息中避免使用 emoji,尤其是在段数很重要的场景。
- 注意扩展表字符(€、{、}、[、]、\、~、^、|),每个占用两个字符位。
- 如果使用非拉丁文字(中日韩、阿拉伯文、泰文),从一开始就按 UCS-2 的限制来规划:单段 70 个字符,拆分时每段 67 个字符。
- 使用可识别的链接并检查其长度。品牌短链接可以节省空间;在选择缩短服务之前,请确认短信接收地的链接要求。
后续步骤
- 智能编码:查看所有替换规则并按消息启用。
- 发送 SMS:发送一条消息并查看其分段计数。
- SMS 日志:查看已发送消息的编码和计费段数。
- SMS 分段:为什么一个表情符号会让费用翻倍:一段视频,发送两条消息并比较各自的费用