决定你付多少钱的四个数字。每一个是从哪来的,以及哪些字符会悄悄把你从前一组推到后一组。
| 情况 | 可用字数 | 在 HantarSMS 上能打 |
|---|---|---|
| 纯英文,一条装得下 | 160 | 156 |
| 纯英文,拆成多段 | 每段 153 | 2 段 302,3 段 455 |
| 含任何非 GSM 字符(中文等),一条 | 70 | 66 |
| 含任何非 GSM 字符,拆段 | 每段 67 | 2 段 130,3 段 197 |
最后一列比较少,是因为上游通道会在每条短信前加 4 个字符前缀(下面有解释)。
一条短信的载荷是 140 字节 —— 这个上限是 1980 年代设计标准时,按信令通道的剩余容量定下来的。GSM-7 字母表每个字符只占 7 位而不是 8 位,所以 140 字节 × 8 ÷ 7 = 160 个字符。这不是谁定的政策,而是算出来的结果。
较长的短信不是当成几条独立短信发出去的。它被拆成几段,每段都带一个 6 字节的头(UDH),告诉手机这段属于哪条短信、按什么顺序拼回去。这个头吃掉 GSM-7 的 7 个字符空间,剩下 153。
这就产生了一个反直觉、会让人多花钱的边界。下面的长度是你在 HantarSMS 上打的字,上游加的 4 个字符前缀另外算:
| 长度 | 段数 | 原因 |
|---|---|---|
| 156 | 1 | 加上前缀是 160 —— 不用拆,不需要头 |
| 157 | 2 | 加上前缀是 161:要拆,两段都降到 153 |
| 302 | 2 | 加上前缀是 306 = 153 × 2 |
| 303 | 3 | 加上前缀是 307;153 × 3 = 459 可用 |
超过 156 一个字符,账单就翻倍。把 157 个字符的短信删掉一个字,是短信里最便宜的省钱方法。
GSM-7 是一套固定、大约 128 个字符的字母表。只要有任何一个字符不在里面,整条短信就要改用 UCS-2(Unicode),每个字符占 16 位而不是 7 位。140 字节 ÷ 2 = 70 个字,拆段后每段 67。
这适用于整条短信,不只是那一个字符。150 个字符的英文促销是一段;加一个 emoji 就变成 151 个 Unicode 字符 —— 加上 4 个字符前缀是 155 —— 按每段 67 算就是三段。一个字符,费用三倍。中文短信也是同样道理:只要有一个中文字,就按 Unicode 计。
emoji 很明显。真正坑人的是下面这些,通常是从文字处理软件或设计工具里复制过来的:
| 看起来像 | 实际是 | 改打成 |
|---|---|---|
| ’ 弯撇号 | U+2019,不在 GSM 里 | ' 直撇号 |
| “ ” 弯引号 | U+201C/201D | " 直引号 |
| – 短破折号、— 长破折号 | U+2013 / U+2014 | - 连字号 |
| … 省略号字符 | U+2026 | ... 三个点 |
| 不换行空格 | U+00A0 | 普通空格 |
| 任何中文、淡米尔文或爪夷文 | 本来就是 Unicode | 没有替代方法 —— 按 66 字计算 |
文字处理软件会在你打字时自动把前四种替换掉。短信看起来是纯英文、平台却显示 Unicode,原因多半就是这几个。
在 GSM 标准里,[ ] { } \ ~ ^ | 要用转义序列存成两个字符,很多计算器会把它们算两次。在我们的通道上,它们各算一个字符,也不会触发 Unicode(我们对照过上游计费记录:一条以 [ 结尾的 156 字符短信按一段收费)。带重音的字母和欧元符号不一样:é £ € 不是普通英文字符,任何一个都会让整条短信变成 Unicode。
上游通道会在每条短信前加 4 个字符前缀,这几个字符是从你的 160 里扣的,不是运营商的:一段可以放 156 个纯英文字符,Unicode 则是 66 个字。在文本编辑器里量出来刚好 160 个字符的短信,会按 2 段收费。
网上通用的短信字数计算器不知道这一点,所以恰好在算错最贵的边界上算错。我们的分段计算器会算上前缀,显示的段数就是实际收费的段数。
这对活动预算意味着什么,详见马来西亚群发短信费用。
纯英文(GSM-7 编码)单条 160 个字符。更长的会拆段,每段只能放 153,因为拼接用的头占掉了其余部分。含任何非 GSM 字符(例如中文)上限是 70,拆段后每段 67。在 HantarSMS 上,上游通道会在每条短信前加 4 个字符前缀,所以一段可以放 156 个纯英文字符,Unicode 则是 66 个字。
短信里至少有一个字符不在 GSM-7 字母表里,整条短信就被迫改用 Unicode,每个字符占 16 位而不是 7 位。通常是一个 emoji、中文,或者从文字处理软件复制来的弯撇号。
可能会。150 个字符的英文短信是一段;加一个 emoji 变成 151 个 Unicode 字符 —— 加上上游的 4 个字符前缀是 155 —— 按每段 67 算就是三段。emoji 本身不贵,是它让短信里每个其他字符都重新计价。
纯英文 306 个字符(153 × 2),Unicode 134 个字(67 × 2)。注意不是 320:一旦拆段,每一段(包括第一段)都要让出 7 个字符给拼接用的头。在 HantarSMS 上还要扣掉上游的 4 个字符前缀,所以两段你能打的是 302 个纯英文字符或 130 个 Unicode 字。
都算。换行在 GSM-7 里算一个字符。短信末尾多出来的空格也算,这常常是看起来刚好 156 个字符、却按两段收费的原因。