一个弯引号撇号就能改变一条原本全是普通拉丁字母的短信的费用。手机显示的几乎是同样的句子,但 Bird 需要更多的网络分段来发送它。
两种编码是什么?
GSM-7 使用紧凑的字母表,而 UCS-2 用于表示该字母表之外的字符。
普通拉丁字母、数字、常见标点符号以及部分带重音的字母属于 GSM-7 的范围。SMS 字母表规范定义了该字符集。
UCS-2 承载该字符集之外的字符,包括弯引号和 emoji。部分 emoji 在其字符限制中按双倍计数。
中文、日文、韩文、西里尔文、阿拉伯文、泰文和印地文需要 Bird 的 GSM-7 字母表之外的字符。
Bird 如何选择编码?
Bird 会将整个消息体与 GSM-7 进行比对,如果任何字符不在该字母表内,则使用 UCS-2。
编码应用于整个消息体。弯引号撇号不会与周围的文字使用不同的编码。它的存在也会改变那些文字的编码。
您可以通过 segments.encoding 查看结果,其值为 GSM_7BIT 和 UCS2。
编码如何影响分段数?
更宽的编码在每个计费分段中留给文本的空间更少。
Bird 使用以下限制:
| 编码 | 单个分段 | 拆分后每部分 |
|---|---|---|
| GSM-7 | 160 个字符 | 153 个字符 |
| UCS-2 | 70 个字符 | 67 个字符 |
这些限制将某些字符按双倍计数,详见下文。每个拆分部分会预留请求头空间,以便手机拼接各部分。拼接 SMS 对该请求头进行了说明。
一条包含 155 个普通拉丁字母的消息体占用一个 GSM-7 分段。加入一个弯引号撇号后,156 个字符的消息体切换为 UCS-2。它超过了 70 个字符,因此适用多段限制:156 除以 67 向上取整为三个分段。
Bird 对每个分段分别计费。SMS 分段说明了分段数如何成为计费数量。
哪些字符需要特别注意?
弯引号标点、emoji 以及 GSM-7 字母表之外的字符可能改变整条消息的编码。
- 直引号撇号属于 GSM-7 的范围;弯引号撇号不属于。
- 普通连字符属于该范围;排版用的短破折号和长破折号不属于。
- 三个英文句号属于该范围;单个省略号字符
…不属于。 é和ü属于该范围;á、í和ú不属于。
GSM-7 将以下字符按双倍计数:^、{、}、\、[、]、~、| 和 €。换页符(一种请求分页的控制字符)也按双倍计数。因此 80 个欧元符号刚好填满一个分段。
在 UCS-2 中,😀 等 emoji 按双倍计数。35 个刚好填满一个分段。再多一个就会超出其容量。1
智能编码能避免编码切换吗?
当所有替换后的字符都属于 GSM-7 时,智能编码可以替换受支持的标点符号。
您可以在每次发送时通过 options.smart_encoding 启用它,该布尔值接受 true 或 false,默认值为 false。弯引号撇号可以被替换为直引号撇号。省略号可以被替换为三个英文句号。
如果仍有任何不受支持的字符,Bird 会保持原始消息体不变。因此阿拉伯文或日文文本仍然受 Unicode 容量限制。更改此设置无法让这些文字系统适配 GSM-7。
Footnotes
-
对于自定义计算器,Bird 以 septet 为单位度量 GSM-7,以 UTF-16 code unit 为单位度量
UCS2。GSM-7 扩展字符占用两个 septet。UTF-16 对 Unicode 第一区块之外的字符(包括😀)使用两个 code unit。 ↩
简而言之
消息体决定编码方式。
当所有字符都在其字母表范围内时,Bird 使用 GSM-7;当任何字符超出该范围时,则使用 UCS-2。
部分字符按双倍计数。
纯拉丁文本每个分段可容纳 160 个字符。更宽的字母表每个分段可容纳 70 个字符,部分 emoji 按双倍计数。
拆分会减少每部分的容量。
多段消息需要预留请求头空间。纯拉丁文本每部分可容纳 153 个字符。更宽的字母表每部分可容纳 67 个字符,部分字符按双倍计数。
智能编码需要显式启用。
Bird 仅在您启用该选项且整个结果符合 GSM-7 时,才替换受支持的字符。