Sign inGet Started

Codificação inteligente de SMS

Substituições tipográficas podem tirar um SMS de GSM-7. Um editor de texto transforma ' em ’, texto colado contém um travessão, ou um campo de formulário carrega um espaço não separável. Cada um se parece com um caractere GSM-7, mas um único caractere fora do GSM converte todo o corpo para UCS-2, reduzindo a capacidade de cada segmento.

A codificação inteligente substitui esses caracteres pelos equivalentes em GSM-7 antes de Bird entregar a mensagem à operadora. Assim, um corpo que apenas parecia não-GSM permanece GSM-7 e é cobrado com menos segmentos.

Como ativar

Ela vem desativada por padrão, porque altera o texto que o destinatário lê. Defina options.smart_encoding como true em um envio:

await bird.sms.send({
  to: "+31612345678",
  from: "Bird",
  text: "Your order shipped, track it here…",
  category: "transactional",
  options: { smart_encoding: true },
});

Os SDKs de Go e PHP aceitam o campo como anulável, então deixá-lo indefinido usa o padrão de Bird em vez de enviar false.

Defina a codificação inteligente por mensagem. Bird não oferece uma configuração global por conta ou por remetente.

Quando Bird mantém UCS-2

A substituição só é aplicada quando converte todo o corpo para GSM-7. Se qualquer caractere permanecer fora de GSM-7, Bird envia o corpo exatamente como fornecido.

Um único emoji, caractere CJK ou letra acentuada fora de GSM-7 mantém toda a mensagem em UCS-2:

Exemplo de código
{ "text": "Hoe gaat het vandaag? á “" }

O “ é substituível, mas á não está em GSM-7 e não tem entrada na tabela, então esse corpo é enviado inalterado como UCS-2. GSM-7 inclui à, ä, å, é, è, ì, ò, ù, ö, ñ, ü, mas não á, í ou ú.

Letras acentuadas estão deliberadamente ausentes da tabela. Converter á para a mudaria a palavra em vez de aproximá-la, o que é a troca errada para quem escreve em espanhol ou português.

A normalização afeta acentos combinantes. Em texto NFD, um ê decomposto armazena o acento como uma marca combinante separada, então a codificação inteligente o converte para e^. Um ê pré-composto permanece inalterado e usa UCS-2.

O que ela não faz

  • Ela nunca trunca. Um corpo acima do limite de 12 segmentos é rejeitado com um 422, e o limite é medido após a substituição, então ativar a opção pode trazer um corpo grande demais para dentro do limite.
  • Ela não altera um corpo que já é GSM-7, pois não há segmentos a economizar.
  • Ela não muda o que você paga além da contagem de segmentos: a contagem é calculada a partir do corpo como enviado.

Consultando o que aconteceu

A mensagem informa as duas partes. text é o corpo como enviado, e options.smart_encoding informa a configuração que foi aplicada:

Exemplo de código
{
  "text": "Your order shipped - track it here...",
  "segments": { "count": 1, "encoding": "GSM_7BIT", "characters": 36 },
  "options": { "smart_encoding": true }
}

Um encoding de UCS2 em um envio em que você ativou a opção indica que o corpo não pôde ser convertido para GSM-7. Para ver o que aconteceria com uma mensagem específica antes de enviá-la, cole o texto na calculadora de segmentos SMS.

A tabela completa de substituição

A tabela de substituição lista cada caractere alterado quando a codificação inteligente está ativa. Os demais caracteres, incluindo os que já estão em GSM-7, permanecem inalterados.

SubstituiçãoCaracteres substituídos
espaçoU+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
00 U+FF10
11 U+FF11
1/2½ U+00BD
1/4¼ U+00BC
22 U+FF12
33 U+FF13
3/4¾ U+00BE
44 U+FF14
55 U+FF15
66 U+FF16
77 U+FF17
88 U+FF18
99 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
QQ 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
XX 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
removidoU+200B, U+2028, U+2029, U+2060, U+FEFF

Variantes de espaço em branco são reduzidas a um único espaço (U+0020). A última linha lista caracteres de largura zero e de formatação que são excluídos em vez de substituídos.

Próximos passos