BroadNet
O JornalEngenharia
Engenharia

Codificação e segmentação de mensagens SMS: GSM-7, Unicode (UCS-2) e mensagens multipartes.

Um SMS transporta 140 bytes: 160 caracteres GSM-7 ou apenas 70 em Unicode (UCS-2). A codificação, o UDH e a segmentação definem o limite de caracteres e o custo do seu SMS.

10 min de leitura
Engenharia · Edição 19
10 min de leitura

limite de caracteres de um SMS depende inteiramente da codificação. Cada SMS carrega uma carga útil fixa de 140 bytes, portanto, uma mensagem usando o alfabeto padrão GSM-7 comporta 160 caracteres, enquanto uma que contenha qualquer caractere não GSM-7 — um emoji, uma letra árabe, uma aspa curva — utiliza a codificação UCS-2 de 16 bits e comporta apenas 70 caracteres. Textos mais longos são divididos em segmentos cobrados separadamente.

Quer os números de uma mensagem específica? Cole-os na calculadora de segmentos SMS para ver a codificação, a contagem de segmentos e o limite de caracteres, ou verifique exatamente quais caracteres forçam o Unicode com o verificador GSM-7 / Unicode.

Tudo deriva de 140 bytes

O corpo de uma mensagem SMS — o campo que o 3GPP chama de TP-User-Data — tem um limite de 140 octetos, ou 1.120 bits. Essa única restrição determina toda a contagem de caracteres que você verá citada. A quantidade de caracteres que cabem é simplesmente 1.120 dividido pelo número de bits que cada caractere consome; portanto, a única questão real é qual codificação o seu texto utiliza. Duas codificações são importantes na prática: GSM-7 e UCS-2.

GSM-7 vs UCS-2: duas maneiras de compactar os mesmos 140 bytes

GSM-7: o alfabeto padrão de 7 bits

GSM-7 é o alfabeto padrão para SMS, definido na especificação 3GPP TS 23.038. Ele codifica cada caractere em 7 bits, portanto, 1.120 bits comportam 160 caracteres — o limite clássico de um único SMS. A sua tabela abrange o alfabeto latino, dígitos, pontuação comum e alguns símbolos. Crucialmente, um pequeno conjunto de caracteres reside numa extensão de conjunto de caracteres básica e cada um custa dois septetos, pois é codificado como um byte de escape seguido pelo caractere. Esses caracteres são ^ { } \ [ ] ~ | e o símbolo do euro €. Uma mensagem preenchida com símbolos do euro, portanto, comporta apenas 80 caracteres num único SMS, e não 160.

Você pode ver exatamente quais caracteres no seu texto são alfabéticos, extensões ou não alfabéticos com o verificador GSM-7 / Unicode antes de enviar.

UCS-2: Unicode de 16 bits

Quando o texto contém um único caractere que o GSM-7 não consegue representar, toda a mensagem é recodificada em UCS-2, uma codificação Unicode de 16 bits com largura fixa. Com 16 bits por caractere, 1.120 bits comportam apenas 70 caracteres. Não há atualização parcial nem mistura de caracteres: um único caractere fora do alfabeto reduz pela metade o limite de 160 para 70 bits. Isso não é um bug — um SMS declara uma codificação para todo o seu corpo, portanto, o remetente deve escolher aquela que consegue representar todos os caracteres presentes.

Os limites de caracteres, lado a lado

CodificaçãoBits por caractereSMS únicoPor segmento (multipartes)
GSM-7 (alfabeto padrão)7160153
UCS-2 (Unicode de 16 bits)167067

Os valores por segmento são inferiores aos limites de mensagem única porque uma mensagem concatenada utiliza parte de seus 140 bytes num cabeçalho, que será abordado a seguir. Observe que os caracteres de extensão mencionados acima ainda ocupam duas posições GSM-7 dentro de um segmento, portanto, um segmento repleto de colchetes ou símbolos de euro comporta bem menos de 153 caracteres visíveis.

Como funciona o SMS multipart (concatenado)

Textos com mais de uma mensagem não são truncados — o SMSC remetente os divide em segmentos, cada um um SMS independente, e o aparelho recetor os junta novamente antes de exibi-los. A coordenação é feita por um Cabeçalho de Dados do Utilizador (UDH) colocado no início da carga útil de cada segmento, definido na especificação 3GPP TS 23.040. Para concatenação padrão, o UDH tem 6 bytes e contém um número de referência partilhado por todas as partes, a contagem total de partes e o número de sequência dessa parte, para que o aparelho possa remontá-las na ordem correta.

snippet
UDH para um SMS concatenado = 6 bytes
05 00 03 RR TT SS
| | | | | |
| | | | | +- número de sequência desta parte (1..TT)
| | | | +---- número total de partes (TT)
| | | +------- número de referência (idêntico em todas as partes)
| | +---------- comprimento deste elemento de informação = 3
| +------------- IEI = 00 (SMS concatenado, referência de 8 bits)
+---------------- Comprimento do UDH = 05 (seguem-se mais 5 bytes)

Esses 6 bytes são extraídos da mesma carga útil de 140 bytes, restando 134 bytes para o texto. É por isso que uma mensagem multipart contém 153 caracteres GSM-7 por segmento (o cabeçalho é alinhado em septetos, consumindo sete das 160 posições) e 67 caracteres UCS-2 por segmento (134 bytes ÷ 2). Algumas plataformas usam um UDH de 7 bytes com um número de referência de 16 bits, o que reduz esses valores para 152 e 66. A calculadora de segmentos SMS mostra a divisão exata para qualquer comprimento de mensagem.

Porque um emoji ou um caractere árabe muda tudo?

É aqui que os remetentes se surpreendem. Como um único caractere que não seja GSM-7 força toda a mensagem a usar UCS-2, uma notificação em inglês de 150 caracteres, que cabe confortavelmente num único segmento, pode silenciosamente cair para um limite de 70 caracteres — e ser dividida em três segmentos — no momento em que alguém cola um emoji ou uma aspa estilizada de um processador de texto. A quantidade de caracteres visíveis não mudou; a codificação, sim.

Para remetentes do mercado árabe, isso não é uma exceção, mas sim o padrão. O alfabeto árabe não faz parte do padrão GSM-7, portanto, cada SMS em árabe utiliza o formato UCS-2 desde o primeiro caractere: 70 caracteres numa única mensagem e 67 por segmento subsequente. Uma mensagem bilíngue em árabe e inglês, ou um OTP personalizado em árabe, pode ser rapidamente dividido em vários segmentos. Equipas que enviam mensagens para os países do Conselho de Cooperação do Golfo (CCG), Arábia Saudita, Emirados Árabes Unidos e Egito devem orçar cada modelo em árabe em unidades UCS-2 desde o início, e não em GSM-7.

Caracteres comuns que silenciosamente forçam uma mensagem inteira a usar o formato UCS-2:

  • Emoji de qualquer tipo, incluindo um único 😀 no final de uma mensagem de marketing.
  • Árabe, hebraico, cirílico, grego, chinês e outros alfabetos não latinos.
  • Aspas curvas e apóstrofos (’ ‘ “ ) colados de processadores de texto.
  • Travessões curtos e longos (– —), reticências (…) e espaço não separável.
  • Muitas letras latinas acentuadas que não estão presentes na tabela GSM-7.

Qual o custo da segmentação?

Cada segmento é avaliado e faturado como uma mensagem separada. Um alerta GSM-7 de 160 caracteres é um SMS faturável; adicione um caractere e ele se torna dois segmentos — até 306 caracteres de capacidade — faturados como dois. Um OTP em árabe de apenas 75 caracteres já corresponde a dois segmentos UCS-2 e, portanto, a duas mensagens, mesmo que pareça curto. Em campanhas e OTPs, a disciplina de codificação é um item essencial, não um detalhe cosmético.

  1. Mantenha os modelos transacionais dentro de um único segmento — 160 GSM-7 ou 70 UCS-2 — sempre que a linguagem permitir.
  2. Remover Unicode acidental: normalizar aspas curvas, travessões e espaços não separáveis para os seus equivalentes GSM-7 antes do envio.
  3. Valide a codificação e a contagem de segmentos no momento da compilação, e não após a fatura, usando um verificador no seu pipeline de envio.
  4. Orçamento de modelos árabes e outros não latinos em unidades UCS-2 (70 / 67) desde o início.
  5. Remover conteúdo variável — URLs, nomes longos de comerciantes — que podem fazer com que uma mensagem ultrapasse o limite de um segmento em tempo de execução.
A API de SMS da BroadNet informa a codificação resolvida e a contagem de segmentos em cada mensagem antes do envio e em cada relatório de entrega, permitindo visualizar e controlar a segmentação em produção, em vez de descobri-la apenas na fatura. Detalhes completos de solicitações e respostas estão disponíveis na documentação para desenvolvedores.

Perguntas frequentes

Quantos caracteres tem uma mensagem SMS?

Uma mensagem SMS contém 140 bytes de dados. Utilizando o alfabeto padrão GSM-7, que possui 160 caracteres, se o texto contiver algum caractere fora do padrão GSM-7 — um emoji, uma letra acentuada ou arábica, uma aspa curva — a mensagem passa a ser codificada em UCS-2 e comporta 70 caracteres. Textos mais longos são divididos em segmentos concatenados de 153 (GSM-7) ou 67 (UCS-2) caracteres cada.

Porque a minha mensagem SMS está a ser contabilizada como tendo apenas 70 caracteres?

Como um elemento do texto não faz parte do alfabeto GSM-7, toda a mensagem foi recodificada em UCS-2 de 16 bits, que comporta apenas 70 caracteres. Os culpados mais comuns são emojis, alfabetos não latinos e aspas curvas, travessões ou espaços não separáveis copiados de um processador de texto. Substituindo ou removendo esse caractere, a mensagem regressa ao limite de 160 caracteres do GSM-7.

O que é a codificação UCS-2 em SMS?

UCS-2 é a codificação Unicode de 16 bits de largura fixa usada pelo SMS quando o texto não pode ser representado no alfabeto GSM-7 de 7 bits. Dois bytes por caractere significam que a carga útil de 140 bytes comporta 70 caracteres numa única mensagem ou 67 por segmento numa mensagem multipart. Qualquer caractere árabe, emoji ou outro caractere não-GSM-7 no corpo da mensagem força a conversão de todo o SMS para UCS-2.

Porque a minha mensagem foi dividida em duas?

O texto excedeu o limite de mensagem única para a sua codificação — 160 caracteres em GSM-7 ou 70 em UCS-2 — portanto, foi enviado como uma mensagem concatenada (multipart). Cada segmento carrega um cabeçalho de dados do utilizador de 6 bytes para remontagem, reduzindo a capacidade para 153 (GSM-7) ou 67 (UCS-2) caracteres por parte, e cada segmento é cobrado como uma mensagem separada.

Referências

Isso foi útil?

Como escrevemos e revemos os conteúdos

Escrito por

Equipa Editorial da BroadNet

A Equipa Editorial publica o blog da BroadNet. Os artigos são escritos com as equipas da BroadNet de assuntos regulatórios, produto, engenharia, pesquisa de mercado e soluções para operadoras, e revisados segundo os nossos padrões editoriais.

O jornal, por e-mail

Um ensaio por mês. Nada mais.

Assine e enviaremos o próximo conteúdo — sobre engenharia, regulamentação ou indústria — no mesmo dia em que for publicado. Sem campanhas de e-mail marketing, sem propaganda de produtos, sem partilha com terceiros. Cancele a assinatura com um clique.

Enviamos um e-mail por mês. Cancele quando quiser. Veja nossa política de privacidade.

O que você vai receber
  • Texto longo, não isca para cliques
    De seis a onze minutos de escrita concentrada sobre um único tópico.
  • Escrito por operadores
    Engenheiros, responsáveis pela área regulatória e redação de produtos, tudo feito internamente.
  • Consciente da região
    Uma visão sobre reguladores, operadores e mix de canais com base na região MENA.
  • Uma vez por mês
    Sem campanhas de gotejamento. Um ensaio quando houver apenas um para partilhar.
Pare de ler. Comece a enviar.

A maior parte do que escrevemos aprendemos na prática.

Se você se identificou com este texto, provavelmente deveríamos conversar. Traga o seu caso de uso, os volumes, os mercados — e nós apresentaremos encaminhamento, preços e um cliente de referência para você contactar.

$ curl -X POST https://api.broadnet.me/sms/sendSms