SMS

GSM-7 与 UCS-2 编码有什么区别?

GSM-7 使用有限的字母表,每个分段可容纳更多文本;UCS-2 支持更多字符,但每个分段的可用空间更少。

一个弯引号撇号就能改变一条原本全是普通拉丁字母的短信的费用。手机显示的几乎是同样的句子,但 Bird 需要更多的网络分段来发送它。

两种编码是什么?

GSM-7 使用紧凑的字母表,而 UCS-2 用于表示该字母表之外的字符。

普通拉丁字母、数字、常见标点符号以及部分带重音的字母属于 GSM-7 的范围。SMS 字母表规范定义了该字符集。

UCS-2 承载该字符集之外的字符,包括弯引号和 emoji。部分 emoji 在其字符限制中按双倍计数。

中文、日文、韩文、西里尔文、阿拉伯文、泰文和印地文需要 Bird 的 GSM-7 字母表之外的字符。

Bird 如何选择编码?

Bird 会将整个消息体与 GSM-7 进行比对,如果任何字符不在该字母表内,则使用 UCS-2。

编码应用于整个消息体。弯引号撇号不会与周围的文字使用不同的编码。它的存在也会改变那些文字的编码。

您可以通过 segments.encoding 查看结果,其值为 GSM_7BITUCS2

编码如何影响分段数?

更宽的编码在每个计费分段中留给文本的空间更少。

Bird 使用以下限制:

编码单个分段拆分后每部分
GSM-7160 个字符153 个字符
UCS-270 个字符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 启用它,该布尔值接受 truefalse,默认值为 false。弯引号撇号可以被替换为直引号撇号。省略号可以被替换为三个英文句号。

如果仍有任何不受支持的字符,Bird 会保持原始消息体不变。因此阿拉伯文或日文文本仍然受 Unicode 容量限制。更改此设置无法让这些文字系统适配 GSM-7。

智能编码介绍了替换规则,分段计算器可在发送前检查文本。

Footnotes

  1. 对于自定义计算器,Bird 以 septet 为单位度量 GSM-7,以 UTF-16 code unit 为单位度量 UCS2。GSM-7 扩展字符占用两个 septet。UTF-16 对 Unicode 第一区块之外的字符(包括 😀)使用两个 code unit。

简而言之

  1. 消息体决定编码方式。

    当所有字符都在其字母表范围内时,Bird 使用 GSM-7;当任何字符超出该范围时,则使用 UCS-2。

  2. 部分字符按双倍计数。

    纯拉丁文本每个分段可容纳 160 个字符。更宽的字母表每个分段可容纳 70 个字符,部分 emoji 按双倍计数。

  3. 拆分会减少每部分的容量。

    多段消息需要预留请求头空间。纯拉丁文本每部分可容纳 153 个字符。更宽的字母表每部分可容纳 67 个字符,部分字符按双倍计数。

  4. 智能编码需要显式启用。

    Bird 仅在您启用该选项且整个结果符合 GSM-7 时,才替换受支持的字符。

基于同一网络构建。

测试 API 密钥即刻获取。添加付款方式并验证发送者身份后,即可解锁生产环境。

你的下一个创意。
随时连接。