GSM-7 vs UCS-2: por que um emoji duplica a sua fatura de SMS
Um emoji pode duplicar ou triplicar silenciosamente uma fatura de SMS. O GSM 03.38 define duas codificações para a carga útil de 140 bytes: GSM-7 compacto a 160 caracteres, ou UCS-2 a 70. Qualquer caractere fora do alfabeto GSM-7 força a mensagem inteira para UCS-2. Programadores e profissionais de marketing que colam texto de processadores de texto descobrem isto muitas vezes só quando as faturas chegam.
Empacotamento GSM-7: 160 caracteres numa carga útil de 140 bytes
O SMS foi concebido em torno de uma carga útil fixa de dados de utilizador de 140 bytes. O GSM 03.38 define um alfabeto predefinido de 7 bits para que esses 140 bytes possam conter 160 septetos: 140 vezes 8 dividido por 7 é igual a 160. Quando uma mensagem permanece inteiramente dentro desse alfabeto, o telemóvel e o SMSC tratam-na como um único segmento de até 160 caracteres. O conjunto básico cobre letras latinas maiúsculas e minúsculas, dígitos, pontuação comum e um punhado de símbolos monetários e nacionais. Espaços, mudanças de linha e os caracteres habituais da prosa em inglês cabem todos sem penalização.
A concatenação altera a aritmética. As mensagens multiparte inserem um User Data Header para que o dispositivo recetor possa remontar os segmentos por ordem. Um UDH típico de 6 bytes consome espaço de septetos, deixando 153 caracteres de texto utilizável por segmento em GSM-7. A faturação é quase sempre por segmento, não por mensagem lógica, pelo que um corpo GSM-7 de 200 caracteres torna-se dois segmentos faturáveis (153 mais o resto). Compreender a divisão 160 versus 153 é o primeiro passo para prever o custo antes de enviar.
A tabela de extensão: caracteres que já custam dois septetos
O GSM 03.38 define também uma tabela de extensão acedida por um septeto de escape dedicado. Caracteres como os parênteses retos [ ], as chavetas { }, o circunflexo ^, o til ~, a barra vertical |, a barra invertida \ e o sinal do euro não pertencem ao conjunto básico. Cada um deles é codificado como escape mais o ponto de código de extensão, pelo que consome dois dos 160 (ou 153) septetos disponíveis. Uma mensagem que parece curta no ecrã pode, por isso, ultrapassar um limite de segmento mais cedo do que uma contagem ingénua de caracteres sugeriria.
O mecanismo de escape continua a ser GSM-7; não muda a mensagem para UCS-2. Essa distinção importa. Pode incluir alguns euros ou parênteses retos e permanecer no empacotamento eficiente de 7 bits. Só quando o codificador encontra um codepoint que não existe nem no alfabeto básico nem na tabela de extensão é que a mensagem inteira abandona o GSM-7. Até esse momento, cada caractere - incluindo os de extensão de custo duplo - continua a ser contado em septetos face ao limite de 160 ou 153.
| Classe de caracteres | Septetos consumidos em GSM-7 |
|---|---|
| Alfabeto básico (A-Z, a-z, 0-9, pontuação comum) | 1 |
| Tabela de extensão ([ ] { } ^ ~ | \ e euro) | 2 (escape + código) |
| Tudo o que está fora do GSM 03.38 (emoji, aspas curvas, a maioria dos não latinos) | Força a mensagem inteira para UCS-2 |
Fallback UCS-2: um caractere fora do alfabeto recodifica tudo
No momento em que qualquer caractere não pode ser representado em GSM-7, o codificador muda todos os dados de utilizador para UCS-2 de 16 bits (efetivamente unidades de código UTF-16 para o BMP). A mesma carga útil de 140 bytes passa então a conter apenas 70 caracteres. Com um UDH de concatenação o comprimento utilizável desce para 67 caracteres por segmento. Não há recurso parcial: um único emoji, uma aspa tipográfica, um traço médio ou um caractere do árabe, cirílico, CJK ou da maioria dos outros alfabetos reescreve o corpo inteiro. Uma frase em inglês de 140 caracteres que era um segmento GSM-7 torna-se três segmentos UCS-2 assim que se acrescenta uma cara sorridente.
Este é o mecanismo por detrás da fatura surpresa. Os profissionais de marketing redigem frequentemente o texto num processador de texto, colam-no numa ferramenta de SMS e introduzem sem saber aspas curvas ou um espaço não separável. Os programadores que interpolam nomes gerados por utilizadores ou títulos de produtos podem injetar o mesmo gatilho invisível. Como a recodificação é tudo ou nada, a contagem de segmentos salta de forma descontínua. A faturação multiplica-se pelo novo total de segmentos. Os valores publicados com tudo incluído como US $0.0125 por mensagem, com tarifas a partir de $0.004 em 149 países, tornam a aritmética concreta: cada segmento extra é mais uma cobrança completa, não um acréscimo fracionário.
| Codificação | Limite de segmento único | Limite de segmento concatenado |
|---|---|---|
| GSM-7 (7 bits) | 160 caracteres | 153 caracteres |
| UCS-2 (16 bits) | 70 caracteres | 67 caracteres |
Armadilhas invisíveis e alfabetos que forçam UCS-2
Os processadores de texto substituem habitualmente apóstrofos e aspas retas por formas tipográficas curvas, transformam hífenes duplos em travessões e inserem espaços não separáveis. Nenhum desses codepoints pertence ao GSM 03.38. Uma mensagem que parece idêntica a uma versão ASCII simples no ecrã pode por isso viajar como UCS-2 e custar vários segmentos. O mesmo se aplica a conteúdo copiado de páginas web ou ferramentas de design que favorecem Unicode mais rico. Verificar os pontos de código reais, não os glifos renderizados, é a única defesa fiável.
A escolha da língua é igualmente decisiva. Mensagens em inglês puro, francês básico, alemão, espanhol e similares em alfabeto latino costumam permanecer em GSM-7 se se evitarem ou transliterarem letras acentuadas que caem fora do alfabeto predefinido. O grego, o cirílico, o árabe, o hebraico, o devanágari, o tailandês e a família CJK não têm mapeamento GSM-7 para letras ordinárias, pelo que qualquer uso substancial desses alfabetos força UCS-2 para a mensagem inteira. Até um único nome ou palavra de produto nesses alfabetos é suficiente. Emojis de todo o tipo situam-se fora do GSM-7 por definição. A regra prática é simples: se o caractere não estiver no conjunto básico ou de extensão do GSM 03.38, a carga útil inteira passa a 70/67.
Correções práticas antes de enviar
A transliteração mantém as mensagens em GSM-7 à custa da fidelidade ortográfica. Substituir caracteres acentuados pelos equivalentes ASCII mais próximos, converter aspas curvas em retas e mapear travessões de volta para hífenes restaura frequentemente os limites de 160/153. Para nomes de marca ou texto legal que deve permanecer exato, aceite UCS-2 e faça orçamento para a contagem de segmentos mais elevada. Verificações automatizadas pré-envio que analisam codepoints não GSM-7 e reportam o total de segmentos resultante sob ambas as codificações dão a programadores e profissionais de marketing um sinal de custo claro antes de a mensagem ser submetida ao SMSC.
Ao criar modelos, mantenha os campos variáveis sob escrutínio: um nome de cliente noutro alfabeto ou um título de produto que contenha um emoji pode converter silenciosamente um modelo que de outra forma seria GSM-7. Remova ou normalize o texto colado de fontes de texto formatado. Prefira pontuação ASCII reta em textos de marketing destinados a SMS. Se tiver de enviar emoji ou texto não latino, desenhe o corpo de forma a que as fronteiras dos segmentos UCS-2 caiam em quebras naturais de frase e mantenha o comprimento total no menor número possível de blocos de 67 caracteres. Contadores de comprimento conscientes dos segmentos que alternam a visualização entre 160/153 e 70/67 conforme o alfabeto detetado eliminam a maior parte da surpresa. As tarifas variam por operadora e rota; os valores publicados citados anteriormente ilustram o modelo por segmento em vez de uma tarifa universal. Permanece uma incerteza honesta quanto à renderização exata em telemóveis de caracteres limítrofes, por isso teste em dispositivos representativos quando a mensagem for importante.
Perguntas frequentes
- Porque é que adicionar um emoji transforma o meu SMS em várias mensagens?
- Qualquer caractere fora do alfabeto GSM 03.38, incluindo todos os emojis, força a mensagem inteira de GSM-7 para UCS-2. A carga útil de 140 bytes passa a conter 70 caracteres em vez de 160 (67 em vez de 153 quando concatenada). Um corpo que cabia num segmento GSM-7 pode assim tornar-se dois ou três segmentos UCS-2, e a faturação cobra por segmento.
- As aspas curvas e os travessões alteram mesmo a codificação SMS?
- Sim. Aspas curvas tipográficas, travessões, meios-travessões e espaços não separáveis não estão nos conjuntos básico ou de extensão GSM-7. Colá-los de um processador de texto recodifica a mensagem inteira como UCS-2, reduzindo o limite por segmento de 160/153 para 70/67 mesmo quando o texto parece inalterado no ecrã.
- Quantos caracteres cabem num SMS concatenado em GSM-7 versus UCS-2?
- Em GSM-7, um segmento concatenado contém 153 caracteres após o UDH típico de 6 bytes. Em UCS-2, o mesmo cabeçalho deixa 67 caracteres por segmento. Os limites de segmento único são 160 para GSM-7 e 70 para UCS-2. É a contagem de segmentos, e não a de mensagens lógicas, que determina o custo.