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.