SMS 智能编码
排版自动替换可能使 SMS 脱离 GSM-7。文字处理器将 ' 转为 ’,粘贴的文本中包含长破折号,或表单字段中带有不间断空格。这些字符看上去与 GSM-7 字符相似,但一个非 GSM 字符就会将整个正文转为 UCS-2,减少每个分段的容量。
智能编码会在 Bird 将消息交给运营商之前,把这些字符替换为对应的 GSM-7 字符,从而使仅因外观看似非 GSM 的正文保持 GSM-7 编码,并按更少的分段计费。
如何启用
该功能默认关闭,因为它会改变收件人看到的文本。在发送时将 options.smart_encoding 设为 true:
await bird.sms.send({
to: "+31612345678",
from: "Bird",
text: "Your order shipped, track it here…",
category: "transactional",
options: { smart_encoding: true },
});client.sms.send(
to="+31612345678",
from_="Bird",
text="Your order shipped, track it here…",
category="transactional",
smart_encoding=True,
)_, err := client.Sms.Send(context.Background(), bird.SmsSendParams{
To: "+31612345678",
From: "Bird",
Text: "Your order shipped, track it here…",
Category: bird.SMSCategoryTransactional,
SmartEncoding: bird.Bool(true),
})$bird->sms->send(
to: '+31612345678',
from: 'Bird',
text: 'Your order shipped, track it here…',
category: 'transactional',
smartEncoding: true,
);bird sms send \
--category transactional \
--from Bird \
--smart-encoding=true \
--text 'Your order shipped, track it here…' \
--to +31612345678curl -X POST https://eu1.platform.bird.com/v1/sms/messages \
-H "Authorization: Bearer bk_eu1_..." \
-H "Content-Type: application/json" \
-d '{
"to": "+31612345678",
"from": "Bird",
"text": "Your order shipped, track it here…",
"category": "transactional",
"options": { "smart_encoding": true }
}'Go 和 PHP SDK 将其作为可空字段,因此不设置该字段时使用 Bird 的默认值,而非发送 false。
智能编码按消息设置。Bird 不提供账户级或发送方级的全局设置。
Bird 何时保留 UCS-2
仅当替换能将整个正文转为 GSM-7 时才会执行替换。如果有任何字符仍在 GSM-7 之外,Bird 会原样发送正文。
单个表情符号、CJK 字符或不在 GSM-7 中的重音字母都会使整条消息保持 UCS-2:
{ "text": "Hoe gaat het vandaag? á “" }“ 可以被替换,但 á 不在 GSM-7 中,且在替换表中没有对应条目,因此该正文以 UCS-2 原样发送。GSM-7 包含 à、ä、å、é、è、ì、ò、ù、ö、ñ、ü,但不包含 á、í 或 ú。
重音字母被有意排除在替换表之外。将 á 折叠为 a 会改变单词本身而非近似表示,这对于使用西班牙语或葡萄牙语的发送者来说是错误的取舍。
Unicode 规范化会影响组合重音。在 NFD 文本中,分解后的 ê 将重音存储为单独的组合标记,因此智能编码会将其转换为 e^。预组合的 ê 保持不变,并使用 UCS-2。
它不做什么
- 它不会截断正文。超过 12 分段上限的正文会被拒绝并返回
422,而该上限在替换之后计算,因此启用智能编码可以使超限正文降到上限以内。 - 它不会处理已经是 GSM-7 的正文,因为没有可节省的分段。
- 除了分段数之外,它不会改变您的计费项目:计数基于实际发送的正文计算。
回读处理结果
消息会报告两部分信息。text 是实际发送的正文,options.smart_encoding 报告生效的设置:
{
"text": "Your order shipped - track it here...",
"segments": { "count": 1, "encoding": "GSM_7BIT", "characters": 36 },
"options": { "smart_encoding": true }
}在您已启用智能编码的发送中,encoding 为 UCS2 表示正文无法转为 GSM-7。要在发送前查看特定消息的处理结果,请将文本粘贴到 SMS 分段计算器中。
完整替换表
替换表列出了智能编码开启时被替换的所有字符。其他字符(包括已在 GSM-7 中的字符)保持不变。
| 替换结果 | 被替换的字符 |
|---|---|
| 空格 | U+00A0, U+2000, U+2001, U+2002, U+2003, U+2004, U+2005, U+2006, U+2007, U+2008, U+2009, U+200A, U+202F, U+205F, U+3000 |
! | ǃ U+01C3, ︕ U+FE15, ﹗ U+FE57, ! U+FF01 |
!! | ‼ U+203C |
" | « U+00AB, » U+00BB, ʺ U+02BA, ˮ U+02EE, “ U+201C, ” U+201D, „ U+201E, ‟ U+201F, ❝ U+275D, ❞ U+275E, 〝 U+301D, 〞 U+301E, " U+FF02 |
# | ﹟ U+FE5F, # U+FF03 |
$ | ﹩ U+FE69, $ U+FF04 |
% | ﹪ U+FE6A, % U+FF05 |
& | ﹠ U+FE60, & U+FF06 |
' | ` U+0060, ´ U+00B4, ʹ U+02B9, ʻ U+02BB, ʼ U+02BC, ʽ U+02BD, ˈ U+02C8, ˊ U+02CA, ˋ U+02CB, U+0313, U+0314, ‘ U+2018, ’ U+2019, ‛ U+201B, ❛ U+275B, ❜ U+275C, ︐ U+FE10, ︑ U+FE11, ' U+FF07 |
( | ❨ U+2768, ❪ U+276A, ⟮ U+27EE, ⦅ U+2985, ﹙ U+FE59, ( U+FF08 |
) | ❩ U+2769, ❫ U+276B, ⟯ U+27EF, ⦆ U+2986, ﹚ U+FE5A, ) U+FF09 |
* | ⁎ U+204E, ∗ U+2217, ⊛ U+229B, ✢ U+2722, ✣ U+2723, ✤ U+2724, ✥ U+2725, ✱ U+2731, ✲ U+2732, ✳ U+2733, ✺ U+273A, ✻ U+273B, ✼ U+273C, ✽ U+273D, ❃ U+2743, ❉ U+2749, ❊ U+274A, ❋ U+274B, ⧆ U+29C6, ﹡ U+FE61, * U+FF0A |
+ | ˖ U+02D6, ﹢ U+FE62, + U+FF0B |
, | U+0326, ‚ U+201A, 、 U+3001, ﹐ U+FE50, ﹑ U+FE51, , U+FF0C, 、 U+FF64 |
- | ‐ U+2010, – U+2013, — U+2014, ― U+2015, • U+2022, ⁃ U+2043, ⎼ U+23BC, ⎽ U+23BD, ﹣ U+FE63, - U+FF0D |
. | 。 U+3002, ﹒ U+FE52, . U+FF0E, 。 U+FF61 |
... | … U+2026 |
/ | ÷ U+00F7, U+0337, U+0338, ⁄ U+2044, ∕ U+2215, ⧸ U+29F8, / U+FF0F |
0 | 0 U+FF10 |
1 | 1 U+FF11 |
1/2 | ½ U+00BD |
1/4 | ¼ U+00BC |
2 | 2 U+FF12 |
3 | 3 U+FF13 |
3/4 | ¾ U+00BE |
4 | 4 U+FF14 |
5 | 5 U+FF15 |
6 | 6 U+FF16 |
7 | 7 U+FF17 |
8 | 8 U+FF18 |
9 | 9 U+FF19 |
: | ː U+02D0, ˸ U+02F8, ⦂ U+2982, ꞉ U+A789, ︓ U+FE13, : U+FF1A |
; | ⁏ U+204F, ︔ U+FE14, ﹔ U+FE54, ; U+FF1B |
< | ‹ U+2039, ﹤ U+FE64, < U+FF1C |
= | U+0347, ꞊ U+A78A, ﹦ U+FE66, = U+FF1D |
> | › U+203A, ﹥ U+FE65, > U+FF1E |
? | ︖ U+FE16, ﹖ U+FE56, ? U+FF1F |
@ | ﹫ U+FE6B, @ U+FF20 |
A | ᴀ U+1D00, A U+FF21 |
B | ʙ U+0299, B U+FF22 |
C | ᴄ U+1D04, C U+FF23 |
D | ᴅ U+1D05, D U+FF24 |
E | ᴇ U+1D07, E U+FF25 |
F | ꜰ U+A730, F U+FF26 |
G | ɢ U+0262, G U+FF27 |
H | ʜ U+029C, H U+FF28 |
I | ɪ U+026A, I U+FF29 |
J | ᴊ U+1D0A, J U+FF2A |
K | ᴋ U+1D0B, K U+FF2B |
L | ʟ U+029F, L U+FF2C |
M | ᴍ U+1D0D, M U+FF2D |
N | ɴ U+0274, N U+FF2E |
O | ᴏ U+1D0F, O U+FF2F |
P | ᴘ U+1D18, P U+FF30 |
Q | Q U+FF31 |
R | ʀ U+0280, R U+FF32 |
S | ꜱ U+A731, S U+FF33 |
T | ᴛ U+1D1B, T U+FF34 |
U | ᴜ U+1D1C, U U+FF35 |
V | ᴠ U+1D20, V U+FF36 |
W | ᴡ U+1D21, W U+FF37 |
X | X U+FF38 |
Y | ʏ U+028F, Y U+FF39 |
Z | ᴢ U+1D22, Z U+FF3A |
[ | [ U+FF3B |
\ | U+20E5, ⧵ U+29F5, ⧹ U+29F9, ﹨ U+FE68, \ U+FF3C |
] | ] U+FF3D |
^ | ˆ U+02C6, U+0302, U+1DCD, ^ U+FF3E |
_ | U+0332, ‗ U+2017, _ U+FF3F |
{ | ❴ U+2774, ﹛ U+FE5B, { U+FF5B |
| | U+20D2, U+20D3, ∣ U+2223, ⎜ U+239C, ⎟ U+239F, ⎸ U+23B8, ⎹ U+23B9, ⏐ U+23D0, | U+FF5C |
} | ❵ U+2775, ﹜ U+FE5C, } U+FF5D |
~ | ˜ U+02DC, ˷ U+02F7, U+0303, U+0330, U+0334, ∼ U+223C, ~ U+FF5E |
| 删除 | U+200B, U+2028, U+2029, U+2060, U+FEFF |
各种空白字符变体会被合并为单个空格(U+0020)。最后一行列出的零宽和格式控制字符会被删除而非替换。