短信字符限制详解:GSM-7、Unicode与分段
短信字符限制详解:GSM-7、Unicode与消息分段
快速解答: 一条短信用GSM-7编码可承载160个字符,用Unicode(UCS-2)编码为70个字符。更长的文本分别按153或67字符拆分为多个分段——按分段计费。一个表情符号或一个弯引号就会把整条消息切换到Unicode,容量缩水56%,成本常常翻三倍。中文短信始终使用Unicode,即单条70字符、多段每段67字符。
字符限制看似冷知识,乘以一百万条消息就不是了。一场悄悄从一段变成两段的营销活动,预算直接翻倍。以下是编码计算的精确原理,以及控制方法。
为什么短信限制是160个字符?
短信搭载在GSM信令帧的空余容量中:每条140字节(1120比特)。1120比特能装多少字符,完全取决于每个字符需要多少比特:
| 编码 | 每字符比特数 | 单条短信 | 每段(多段消息) |
|---|---|---|---|
| GSM-7 | 7 | 160 | 153 |
| UCS-2(Unicode) | 16 | 70 | 67 |
GSM-7通过只支持固定的128字符字母表(外加扩展表)把每个字符压缩到7比特。UCS-2几乎支持所有文字和符号,但每字符16比特——所以从160降到70。
GSM-7字母表包含哪些字符?
GSM-7涵盖:
- 拉丁字母A–Z、a–z和数字0–9
- 常用标点:. , ! ? : ; ' " ( ) + - * / = % & # @
- 一组带重音的字母(é、ü、ñ、à、ö等)和希腊大写字母
- 包括欧元和英镑在内的货币符号
扩展表陷阱: 少数字符——方括号、花括号、反斜杠、脱字符、竖线、波浪号和欧元符号——虽在GSM-7中,但每个要按两个字符计算,因为它们以转义符加代码的方式编码。
什么会悄悄把消息切换到Unicode?
GSM-7之外的任何内容都会迫使整条消息进入UCS-2——一个字符就够了。常见嫌疑人:
- 从Word或Google文档粘贴的智能标点:弯引号、弯撇号、长破折号、省略号字符
- 表情符号——任何一个
- 非拉丁文字:中文、日文、韩文、阿拉伯文、希伯来文、泰文、大部分西里尔文
- 不可见字符:不间断空格、复制粘贴带入的零宽连接符
最残酷的案例是弯撇号:与ASCII直撇号在视觉上几乎一样,却把一条160字符的消息变成3段Unicode发送。
消息级联如何工作?
当消息超出单条上限,它被拆分为多个部分,每部分携带一个用户数据头(UDH)——6个字节,告诉接收手机"这是第2段,共3段"。这个头部占用有效载荷空间,所以每段容量下降:
| 消息长度(GSM-7) | 分段数 | 计费条数 |
|---|---|---|
| 1–160字符 | 1 | 1 |
| 161–306字符 | 2 | 2 |
| 307–459字符 | 3 | 3 |
| 460–612字符 | 4 | 4 |
Unicode的分界点是70,然后是134、201、268。手机把各段重组为一个气泡——用户永远看不到拆分,但您的账单看得到:每个分段都按一条完整消息计费。
编码错误到底要花多少钱?
以一条155字符的促销消息发给50万收件人、每段0.01美元计算:
- 干净的GSM-7: 1段 × 500,000 = 5,000美元
- 同样文本加一个表情: 70字符的Unicode分段 → 3段 × 500,000 = 15,000美元
一个字符,一万美元的差距。这是短信营销中最常见的隐性预算泄漏——而且完全可以避免。
如何把消息控制在一个分段?(6条规则)
- 了解真实上限。 GSM-7为160,Unicode为70。如果受众需要非拉丁文字,从一开始就按70/67规划文案。
- 清除智能标点。 发送前把弯引号、弯撇号和破折号归一化为ASCII。在管道中自动化处理——人总会从Word粘贴。
- 把表情符号当作付费功能。 营销中它可以靠互动赚回成本;在OTP和告警中纯属浪费。
- 注意扩展表。 方括号、花括号、波浪号、脱字符、竖线和欧元符号在GSM-7中按双字符计算。
- 检查API响应中的分段数。 好的供应商会返回每条消息的编码和分段数——当某个模板的分段数变化时告警。
- 留意URL和个性化变量。 一条长链接或一个意外偏长的名字都能把临界模板推入下一段。留出10–15个字符余量。
这些规则适用于RCS或WhatsApp吗?
不适用——RCS、WhatsApp等IP消息渠道不使用GSM编码和140字节帧,没有160字符限制,也没有按段计费。但每一场RCS或富媒体渠道营销都需要短信回退,而回退文本要遵守本指南的每一条规则。
ViteMobile的API为每条消息返回编码和分段数,仪表盘会标记分段数漂移的模板——让一个被粘贴进来的弯引号在乘以百万次发送之前就被抓住。
关键要点
- 一条短信 = 140字节:160个GSM-7字符或70个Unicode字符。多段消息每段153/67。
- 一个非GSM字符——一个表情、一个弯引号——就会把整条消息切换到Unicode,成本可能翻三倍。
- 部分GSM-7字符(括号、欧元符号、波浪号)会悄悄按双字符计算。
- 自动归一化标点,为个性化留余量,在生产环境按模板监控分段数。
常见问题
问:一条短信能包含多少个字符? 答:GSM-7编码160个,Unicode编码70个。更长的消息拆分为153(GSM-7)或67(Unicode)字符的分段,每段单独计费。中文短信按70/67计算。
问:为什么我的短信被拆成了多条? 答:超出了单条上限,或某个特殊字符把它切换到了Unicode。级联头部把每段容量降到153/67字符,每段单独计费。
问:表情符号算更多字符吗? 答:算——任何表情都会迫使整条消息进入Unicode(70字符上限),且大多数表情本身占两个编码单元。一个表情能把1段变成3段。
问:哪些字符会破坏GSM-7? 答:弯引号弯撇号、长破折号、省略号字符、不间断空格,以及任何非拉丁文字。括号、花括号和欧元符号仍属GSM-7但按双字符计算。
问:如何把短信控制在一个分段? 答:按正确上限计数、自动把智能标点归一化为ASCII、交易类文本避免表情、为个性化留余量,并监控API返回的分段数。