GSM-7 编码

短信使用的 7 位字符编码。单条消息可容纳 160 个字符,覆盖英文字母、数字和基本符号。

GSM-7 是 GSM (全球移动通信系统) 标准中定义的 7 位字符编码。它作为短信 (SMS) 的默认编码使用,单条消息可容纳 160 个字符。基本字符表共 128 个字符,但排列顺序与 ASCII 并不相同。表中收录了 £、¤、Ä、ö 等西欧语言字母,以及 Δ、Ω 等希腊语大写字母;而 ASCII 中的 [ ] { } \ | ~ ^ 和欧元符号 (€) 却被放在基本表之外。

单条短信被限制在 140 字节 (1,120 位) 以内。GSM-7 每个字符占 7 位,因此 1,120 ÷ 7 = 160,可容纳 160 个字符。而包含中文、日文或表情符号的消息会切换为 UCS-2 (16 位) 编码,容量随之变为 1,120 ÷ 16 = 70 个字符。

扩展表中的字符需要在前面加上一个表示切换的转义码才能发送,因此一个字符要消耗两个字符的额度。为了写 JSON 示例而排列花括号,或者在标价中使用欧元符号,都会让肉眼看到的字符数与计费字符数产生偏差。以为刚好压在 160 个字符以内的消息却被拆成两条发送,事故的根源正是漏算了这份双倍消耗。

切换到 UCS-2 是自动完成的,所以只要在英文消息里加入一个表情符号,字符上限就会从 160 个骤降到 70 个。为了一个表情符号损失 90 个字符的容量,还会牵动短信费用:长消息会被拆分成多条发送,每一条都单独计费。拆分时用于拼接的控制信息会占去 6 字节正文空间,于是每条的容量在 GSM-7 下变为 153 个字符,在 UCS-2 下则是把剩余的 134 字节按每字符 2 字节计算得到的 67 个字符。与其拆成 3 条发送 459 个字符,不如压缩到 160 个字符用 1 条送达,费用只有三分之一。

无意间落到 UCS-2 的原因,除了中文和表情符号,还有容易被忽视的符号混入。文字处理软件自动转换出的右单引号 (’)、全角括号以及波浪号 (〜),在基本表和扩展表中都找不到,因此即便是自认为纯英文的消息,上限也会变成 70 个字符。发送前用程序机械地检查是否混入了 GSM-7 字符表之外的字符,一旦发现就替换为半角的直线型符号 ('),这样最为可靠。

现代即时通讯应用 (LINE、WhatsApp、iMessage) 通过互联网传输,不受 GSM-7 的约束。不过短信凭借只要有电话号码就能送达的普适性,在双因素认证的验证码、紧急通知等场景中依然承担着重要角色。这类用途的惯用做法是:正文只使用半角英文数字和基本表内的符号,并压缩在 1 条之内 (纯英文数字为 160 个字符,若预设会被拆分则为 153 个字符)。

分享这篇文章