O Que É um Contador SMS? Compreender a Codificação GSM 7-Bit e UCS-2

17 Jun 2026 1,279 words

O Que É um Contador SMS?

Um contador SMS é uma ferramenta que calcula quantos caracteres a sua mensagem contém, deteta o tipo de codificação (GSM 7-bit ou UCS-2) e determina em quantos segmentos SMS a mensagem será dividida. Isto é importante porque as operadoras móveis cobram por segmento, não por mensagem, e exceder o limite de SMS único pode duplicar ou triplicar o seu custo sem aviso.

Ao contrário de um contador de caracteres normal, um contador SMS considera as restrições técnicas do padrão Short Message Service definido no GSM 03.38. Considera não apenas o comprimento do seu texto, mas quais caracteres contém e como devem ser codificados para transmissão através de redes celulares.

Como Funciona a Codificação GSM 7-Bit

A especificação GSM 03.38 define um alfabeto padrão de 128 caracteres que podem ser codificados usando 7 bits cada. Isto inclui letras latinas maiúsculas e minúsculas, dígitos, pontuação comum e alguns símbolos especiais. Como cada caractere usa apenas 7 bits em vez de 8, um único SMS pode conter até 160 caracteres — calculado como (140 bytes × 8 bits) / 7 bits por caractere.

Conjunto de caracteres básico GSM 7-bit:

Categoria Caracteres
Letras A–Z, a–z
Dígitos 0–9
Pontuação @, !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /
Símbolos :, ;, <, =, >, ?, ¡, ¿, ¤, £, ¥, §, ¨, ©, ®, ´, `, ^, ~, ¯
Especiais Espaço, nova linha, retorno de carro
Estendidos ^, {, }, , [, ~, ], , € (requerem byte de escape)

Os caracteres GSM 7-bit estendidos — como ^, {, }, [, ], ~, | e — requerem um código de escape (0x1B) antes do caractere. Este byte de escape consome espaço na mensagem, pelo que cada caractere estendido conta efetivamente como 2 caracteres para o limite de 160 caracteres.

Codificação UCS-2: Quando 7 Bits Não São Suficientes

Quando a sua mensagem contém caracteres fora do alfabeto GSM 7-bit — como emojis, aspas curvas, letras acentuadas como é ou ü, travessões como ou qualquer símbolo Unicode — a mensagem inteira muda para codificação UCS-2 (16 bits). No modo UCS-2, cada caractere ocupa 16 bits, reduzindo a capacidade de SMS único de 160 para 70 caracteres.

Caracteres que forçam a codificação UCS-2:

  • Emojis e pictogramas (😊, 🚀, ❤️)
  • Aspas curvas ("", '')
  • Travessões longos (, )
  • Caracteres acentuados não no conjunto básico GSM (ě, ř, č)
  • Símbolos de moeda além de $, £, ¥,
  • Setas (, , , )
  • Símbolos matemáticos (, , , )
  • A maioria dos caracteres CJK (Chinês, Japonês, Coreano)

Assim que uma mensagem contém mesmo um único caractere UCS-2, a mensagem inteira usa codificação de 16 bits. Não existe modo híbrido — é tudo 7-bit ou tudo 16-bit.

SMS Multipartes e Limites de Segmento

Quando a sua mensagem excede o limite de SMS único (160 caracteres GSM ou 70 caracteres UCS-2), a operadora divide-a em múltiplos segmentos. Cada segmento inclui um cabeçalho de dados de utilizador (UDH) de 6 bytes para remontagem, o que reduz o espaço disponível para payload.

Codificação SMS Único Multipartes (por segmento)
GSM 7-bit 160 caracteres 153 caracteres
UCS-2 70 caracteres 67 caracteres

Como o cálculo funciona:

GSM 7-bit multipartes:
  caracteres_por_segmento = (140 - 6) × 8 / 7 = 153

UCS-2 multipartes:
  caracteres_por_segmento = (140 - 6) / 2 = 67

Uma mensagem de 200 caracteres em codificação GSM 7-bit divide-se em 2 segmentos (153 + 47). Uma mensagem de 150 caracteres contendo emoji divide-se em 3 segmentos UCS-2 (67 + 67 + 16). A maioria das operadoras fatura por segmento, por isso compreender estes limites ajuda a controlar custos.

Exemplos de Código

PHP: Contar Segmentos SMS

function countSmsSegments(string $text): array {
    $gsm7 = '@£$¥èéùìòÇØøÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !"#¤%&\'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà';
    $gsm7ext = ['^', '{', '}', '\\', '[', '~', ']', '|', '€'];
    $isUcs2 = false;
    $extCount = 0;

    for ($i = 0; $i < mb_strlen($text); $i++) {
        $char = mb_substr($text, $i, 1);
        if (in_array($char, $gsm7ext)) {
            $extCount++;
        } elseif (mb_strpos($gsm7, $char) === false) {
            $isUcs2 = true;
            break;
        }
    }

    if ($isUcs2) {
        $maxPerSegment = 70;
        $segments = (int)ceil(mb_strlen($text) / $maxPerSegment);
        // Multipartes reduz o limite
        if ($segments > 1) {
            $maxPerSegment = 67;
            $segments = (int)ceil(mb_strlen($text) / $maxPerSegment);
        }
        return ['encoding' => 'UCS-2', 'segments' => $segments, 'chars_per_segment' => $maxPerSegment];
    }

    $effectiveLength = mb_strlen($text) + $extCount;
    $maxPerSegment = 160;
    $segments = (int)ceil($effectiveLength / $maxPerSegment);
    if ($segments > 1) {
        $maxPerSegment = 153;
        $segments = (int)ceil($effectiveLength / $maxPerSegment);
    }
    return ['encoding' => 'GSM 7-bit', 'segments' => $segments, 'chars_per_segment' => $maxPerSegment];
}

JavaScript: Detetar Codificação SMS

const GSM7_BASIC = new Set(
  '@£$¥èéùìòÇØøÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !"#¤%&\'()*+,-./0123456789:;<=>?¡' +
  'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà'.split('')
);
const GSM7_EXT = new Set(['^', '{', '}', '\\', '[', '~', ']', '|', '€']);

function detectSmsEncoding(text) {
  let extCount = 0;
  for (const char of text) {
    if (GSM7_EXT.has(char)) {
      extCount++;
    } else if (!GSM7_BASIC.has(char)) {
      return { encoding: 'UCS-2', extCount: 0 };
    }
  }
  return { encoding: 'GSM 7-bit', extCount };
}

const result = detectSmsEncoding('Hello World! €50');
console.log(result); // { encoding: 'GSM 7-bit', extCount: 1 }

Python: Calcular Partes SMS

def sms_parts(text: str) -> dict:
    gsm7_basic = set('@£$¥èéùìòÇØøÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !"#¤%&\'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà')
    gsm7_ext = {'^', '{', '}', '\\', '[', '~', ']', '|', '€'}
    
    is_ucs2 = False
    ext_count = 0
    
    for char in text:
        if char in gsm7_ext:
            ext_count += 1
        elif char not in gsm7_basic:
            is_ucs2 = True
            break
    
    if is_ucs2:
        limit = 70 if len(text) <= 70 else 67
        parts = (len(text) + limit - 1) // limit
        return {'encoding': 'UCS-2', 'parts': parts, 'chars_per_part': limit}
    
    effective = len(text) + ext_count
    limit = 160 if effective <= 160 else 153
    parts = (effective + limit - 1) // limit
    return {'encoding': 'GSM 7-bit', 'parts': parts, 'chars_per_part': limit}

print(sms_parts('Hello World'))  # 1 part, GSM 7-bit
print(sms_parts('Hello 😊 World'))  # UCS-2 encoding triggered

Por Que a Codificação SMS é Importante para Desenvolvedores

Se constrói aplicações que enviam notificações SMS — como códigos de autenticação de dois fatores, lembretes de consultas ou campanhas de marketing — compreender a codificação SMS ajuda a controlar tanto a capacidade de entrega quanto o custo.

Principais conclusões para desenvolvedores:

  • Valide sempre o comprimento da mensagem antes de enviar para evitar cobranças multipartes inesperadas
  • Remova ou substitua caracteres UCS-2 quando possível para manter as mensagens em GSM 7-bit
  • Teste com caracteres estendidos como e [] — eles comprimem-se de forma diferente dos caracteres GSM básicos
  • Considere o overhead UDH de 6 bytes ao estimar a capacidade multipartes
  • Considere usar uma ferramenta dedicada de contador SMS durante o desenvolvimento e teste

Ferramenta Online

A ferramenta SMS Counter no Help2Code fornece contagem de caracteres em tempo real, deteção de codificação e pré-visualização de segmentos. Cole a sua mensagem e veja instantaneamente se usa codificação GSM 7-bit ou UCS-2, quantos segmentos requer e exatamente onde cada segmento quebra. A pré-visualização de codificação com código de cores mostra quais caracteres ativam o modo Unicode e quais são seguros em 7-bit.

Conclusão

Um contador SMS é um utilitário essencial para quem envia mensagens de texto programaticamente ou quer evitar cobranças inesperadas de operadoras. Ao compreender a diferença entre codificação GSM 7-bit e UCS-2, e sabendo como funciona a segmentação multipartes, pode escrever aplicações SMS mais económicas e depurar problemas de entrega mais rapidamente. Use a ferramenta SMS Counter para testar as suas mensagens antes de as enviar em produção.


About this article

Aprenda o que é um contador SMS, como funcionam as codificações GSM 7-bit e UCS-2 e por que a contagem de caracteres é importante para entrega e faturação de SMS.


Related Articles


Related Tools

Help2Code Logo
Menu