Qu'est-ce qu'un Compteur SMS ? Comprendre les Encodages GSM 7 Bits et UCS-2

17 Jun 2026 1,349 words

Qu'est-ce qu'un Compteur SMS ?

Un compteur SMS est un outil qui calcule le nombre de caractères que contient votre message, détecte le type d'encodage (GSM 7 bits ou UCS-2) et détermine en combien de segments SMS le message sera divisé. Cela est important car les opérateurs mobiles facturent par segment, et non par message, et dépasser la limite d'un seul SMS peut doubler ou tripler votre coût sans avertissement.

Contrairement à un compteur de caractères classique, un compteur SMS tient compte des contraintes techniques de la norme du service de messages courts définie dans le GSM 03.38. Il considère non seulement la longueur de votre texte, mais aussi les caractères qu'il contient et comment ils doivent être encodés pour la transmission sur les réseaux cellulaires.

Comment Fonctionne l'Encodage GSM 7 Bits

La spécification GSM 03.38 définit un alphabet par défaut de 128 caractères qui peuvent être encodés en utilisant 7 bits chacun. Cela inclut les lettres latines majuscules et minuscules, les chiffres, la ponctuation courante et quelques symboles spéciaux. Comme chaque caractère utilise seulement 7 bits au lieu de 8, un seul SMS peut contenir jusqu'à 160 caractères — calculé comme (140 octets × 8 bits) / 7 bits par caractère.

Jeu de caractères de base GSM 7 bits :

Catégorie Caractères
Lettres A–Z, a–z
Chiffres 0–9
Ponctuation @, !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /
Symboles :, ;, <, =, >, ?, ¡, ¿, ¤, £, ¥, §, ¨, ©, ®, ´, `, ^, ~, ¯
Spéciaux Espace, nouvelle ligne, retour chariot
Étendus ^, {, }, , [, ~, ], , € (nécessitent un octet d'échappement)

Les caractères étendus GSM 7 bits — comme ^, {, }, [, ], ~, | et — nécessitent un code d'échappement (0x1B) avant le caractère. Cet octet d'échappement consomme de l'espace dans le message, donc chaque caractère étendu compte effectivement comme 2 caractères par rapport à la limite de 160 caractères.

Encodage UCS-2 : Quand 7 Bits Ne Suffisent Pas

Lorsque votre message contient des caractères en dehors de l'alphabet GSM 7 bits — comme les emojis, les guillemets courbes, les lettres accentuées comme é ou ü, les tirets comme , ou tout symbole Unicode — l'ensemble du message passe en encodage UCS-2 (16 bits). En mode UCS-2, chaque caractère occupe 16 bits, réduisant la capacité d'un seul SMS de 160 à 70 caractères.

Caractères qui imposent l'encodage UCS-2 :

  • Emojis et pictogrammes (😊, 🚀, ❤️)
  • Guillemets courbes ("", '')
  • Tirets longs (, )
  • Caractères accentués non présents dans le jeu GSM de base (ě, ř, č)
  • Symboles monétaires au-delà de $, £, ¥,
  • Flèches (, , , )
  • Symboles mathématiques (, , , )
  • La plupart des caractères CJK (chinois, japonais, coréen)

Dès qu'un message contient ne serait-ce qu'un seul caractère UCS-2, l'ensemble du message utilise l'encodage 16 bits. Il n'existe pas de mode hybride — c'est soit tout en 7 bits, soit tout en 16 bits.

SMS Multipart et Limites de Segments

Lorsque votre message dépasse la limite d'un seul SMS (160 caractères GSM ou 70 caractères UCS-2), l'opérateur le divise en plusieurs segments. Chaque segment inclut un en-tête de données utilisateur (UDH) de 6 octets pour le réassemblage, ce qui réduit l'espace de charge utile disponible.

Encodage SMS Simple Multipart (par segment)
GSM 7 bits 160 caractères 153 caractères
UCS-2 70 caractères 67 caractères

Comment le calcul fonctionne :

GSM 7 bits multipart :
  caractères_par_segment = (140 - 6) × 8 / 7 = 153

UCS-2 multipart :
  caractères_par_segment = (140 - 6) / 2 = 67

Un message de 200 caractères en encodage GSM 7 bits se divise en 2 segments (153 + 47). Un message de 150 caractères contenant des emojis se divise en 3 segments UCS-2 (67 + 67 + 16). La plupart des opérateurs facturent par segment, donc comprendre ces limites vous aide à contrôler les coûts.

Exemples de Code

PHP : Compter les Segments 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);
        // Multipart réduit la 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 : Détecter l'Encodage 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 : Calculer les Parties 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

Pourquoi l'Encodage SMS est Important pour les Développeurs

Si vous créez des applications qui envoient des notifications SMS — comme des codes d'authentification à deux facteurs, des rappels de rendez-vous ou des campagnes marketing — comprendre l'encodage SMS vous aide à contrôler à la fois la délivrabilité et le coût.

Points clés pour les développeurs :

  • Validez toujours la longueur du message avant l'envoi pour éviter des frais multipart inattendus
  • Supprimez ou remplacez les caractères UCS-2 lorsque c'est possible pour garder les messages en GSM 7 bits
  • Testez avec des caractères étendus comme et [] — ils se compressent différemment des caractères GSM de base
  • Tenez compte du surcoût UDH de 6 octets lors de l'estimation de la capacité multipart
  • Envisagez d'utiliser un outil dédié de compteur SMS pendant le développement et les tests

Outil en Ligne

L'outil Compteur SMS sur Help2Code fournit un comptage de caractères en temps réel, une détection d'encodage et un aperçu des segments. Collez votre message et voyez instantanément s'il utilise l'encodage GSM 7 bits ou UCS-2, combien de segments il nécessite, et exactement où chaque segment se coupe. L'aperçu d'encodage coloré vous montre quels caractères déclenchent le mode Unicode et lesquels sont sûrs en 7 bits.

Conclusion

Un compteur SMS est un utilitaire essentiel pour quiconque envoie des messages textuels par programmation ou souhaite éviter des frais de transport inattendus. En comprenant la différence entre les encodages GSM 7 bits et UCS-2, et en sachant comment fonctionne la segmentation multipart, vous pouvez écrire des applications SMS plus rentables et déboguer les problèmes de livraison plus rapidement. Utilisez l'outil Compteur SMS pour tester vos messages avant de les envoyer en production.


About this article

Apprenez ce qu'est un compteur SMS, comment fonctionnent les encodages GSM 7 bits et UCS-2, et pourquoi le nombre de caractères est important pour la livraison et la facturation des SMS.


Related Articles


Related Tools

Help2Code Logo
Menu