1. 计费长度计算流程
- 获取短信内容的字节长度和编码类型(GSM7 或 UCS2)。
- 若目标国家为特殊国家(如马来西亚,国码
60),需额外加上不可见字符长度:
- GSM7 编码:直接加不可见字符长度(单位:字节)。
- UCS2 编码:不可见字符长度 × 2(因 UCS2 为双字节编码)。
- 根据编码类型按以下规则分段计费:
GSM7 编码计费规则
- 单条上限:160 字节
- ≤ 160 字节:计 1 条
-
160 字节:按 154 字节/条 分段(预留 6 字节用于拆分标识),向上取整
UCS2 编码计费规则
- 单条上限:140 字节
- ≤ 140 字节:计 1 条
-
140 字节:按 134 字节/条 分段(预留 6 字节用于拆分标识),向上取整
✅ 总结:
先按编码计算原始字节数 → 加上特殊国家附加长度 → 按单条上限分段(超长时每段预留 6 字节)→ 向上取整得出计费条数。
2. 编码与字符说明
GSM7 编码
- 仅包含 GSM7 基础字符集(参考 GSM 03.38 标准)
- 基础字符:每个占 1 字符
- 扩展字符(如
{ } [ ] ~ | \ €):每个占 2 字符
- 单条短信最多 160 字符(含签名)
- 超长时按 154 字符/条 计费
📎 支持字符参考:GSM 7-bit Default Alphabet
非 GSM7 编码(如中文、日文、韩文等)
- 自动使用 UCS2(UTF-16)编码
- 每个字符固定占 2 字节
- 单条短信最多 70 字符(含签名)
- 超长时按 67 字符/条 计费(即 134 字节 ÷ 2)
3. 特殊国家:马来西亚(国码 60)
- 所有发往马来西亚的短信必须在内容前自动添加不可见头:
RM 0.00
- 作用:告知接收方短信免费;缺失可能导致截断或发送失败
- 该头占用:
- GSM7:7 个字符(7 字节)
- UCS2:7 个字符 × 2 = 14 字节
- 运营商差异:
- Digi:不支持长短信合并,会将多条拆分为独立短信
- 其他运营商:支持长短信(自动拼接)
4. 计费样例
| 短信内容 |
国家 |
编码 |
原始长度 |
计费长度 |
计费条数 |
12345{} |
非马来 |
GSM7 |
5×1 + 2×2 = 9 |
9 |
1 |
12345{} |
马来 |
GSM7 |
9 + 7 = 16 |
16 |
1 |
你的验证码是:123456 |
非马来 |
UCS2 |
13 字符 × 2 = 26 字节 |
26 |
1 |
你的验证码是:123456 |
马来 |
UCS2 |
26 + 14 = 40 字节 |
40 |
1 |
中文...(共71字符) |
非马来 |
UCS2 |
71 × 2 = 142 字节 |
142 |
2(142 ÷ 134 ≈ 1.06 → 向上取整) |
中文...(共64字符) |
马来 |
UCS2 |
(64×2) + 14 = 142 字节 |
142 |
2 |
超长中文...(共140字符) |
非马来 |
UCS2 |
280 字节 |
280 |
3(280 ÷ 134 ≈ 2.09 → 向上取整) |
💡 注意:长短信分片时,每片实际可用容量为 134 字节(UCS2) 或 154 字节(GSM7)
5. 术语说明
- GSM-7:一种 7 位字符编码标准,用于 GSM 网络短信。
由于 SMS 传输 140 字节(1120 位),GSM-7 可容纳 160 个字符(1120 ÷ 7 = 160)。
- UCS2:统一码双字节编码(UTF-16 子集),每个字符固定占 2 字节,短信最大 70 字符。
- 长短信(Concatenated SMS):超过单条容量时,自动拆分为多条并携带拼接标识,接收端合并显示。