手机可以将一条长文本显示为一条消息,即使网络实际传输了多个分段。用于编码文本的字母表决定了 Bird 按多少个分段收费。
什么是分段?
分段是一条网络消息能承载的最大文本片段。纯拉丁文本每个分段可容纳 160 个字符。如果消息中包含哪怕一个超出该字符集的字符,例如 emoji、弯引号或大多数带重音的字母,则每个分段只能容纳 70 个字符。
当一条消息需要多个分段时,每个分段会让出少量空间给手机用于重组的请求头:纯文本每段 153 个字符,宽字符集每段 67 个字符。因此 161 个纯字母需要两个分段,第一段装 153 个,第二段装 8 个。
Bird 将纯文本按 GSM-7 字母表计数,其余内容按 UCS-2 计数,这是运营商接受的两种编码。即使在 GSM-7 中也有少数字符按双倍计数,部分 emoji 在 UCS-2 中同样按双倍计数;编码页面列出了这些字符。
为什么一条消息收了三段的费用?
Bird 按分段数收费,因此一条三段消息按适用费率收取三个单位的费用。
Bird 在接受发送请求时计算分段数。目的地、消息类别和发送方类型也会影响适用价格。请查看 SMS 定价了解您使用的路由。
例如,150 个普通拉丁字母可装入一个分段。加上一个笑脸 emoji,整条消息就会使用 UCS-2。该 emoji 按双倍计数,总数变为 152。将 152 除以多段容量 67,需要三个分段。
哪些字符会改变编码?
GSM-7 之外的任何字符都会将整条消息切换到 UCS-2。
直引号在 GSM-7 中。弯引号则不在。字母 é 和 ü 在其中。字母 á、í 和 ú 则不在。中文、日文、韩文、阿拉伯文、泰文和印地文也需要使用宽编码。
插入模板中的姓名或产品名称可能因此改变整条消息的编码。请在插入这些值之后检查完整文本。
为什么字符计数的结果不一样?
部分字符在分段限额中按双倍计数。
GSM-7 将 €、[、]、{、}、\、~、^ 和 | 各计为两个字符。换页符(用于请求分页)同样按双倍计数。因此 80 个欧元符号刚好填满一个分段。
一条包含 159 个普通拉丁字母加上 € 的消息有 160 个字符,但在限额中计为 161,因此需要两个分段。
部分 emoji(例如 😀)在 UCS-2 中按双倍计数。35 个这样的 emoji 刚好填满一个分段。编码页面列出了需要特别注意的字符。
如何在 Bird 中检查分段数?
您可以从消息响应的 segments 对象中读取计算后的分段数。
count是一个最小值为 1 的整数。每个计入的分段都是一个计费单位。发出消息的上限为 12 段。超出长度的消息会收到 HTTP422,请求被拒绝且文本不会被截断。encoding为GSM_7BIT或UCS2,标识适用的容量。characters统计应用双倍计数规则之前的文本字符数。使用count来检查计费分段数。
如果消息必须控制在一个分段内,请在准备好完整消息体之后检查 count。将插入的姓名包含在内,并将 😀 等字符按双倍计数。
您还可以将 options.smart_encoding 设置为 true 或 false,默认值为 false。启用后,仅当整条结果可以放入 GSM-7 时,才会替换支持的标点。消息体中如有 emoji 则会阻止所有替换。智能编码解释了该行为。
字符限制指南记录了计数规则和响应字段。
简而言之
每个分段都是一个计费单位。
一条被拆分为三个分段的消息按适用费率收取三个单位的费用。
编码方式决定容量。
只要有一个字符不在紧凑的 SMS 字母表中,整条消息就会切换到 Unicode 编码。
部分字符按双倍计数。
一个欧元符号在限额中算两个字符。部分 emoji 同样按双倍计数。
每个多段分段都会预留请求头空间。
拆分会减少每个分段的可用容量,包括第一个。