GSM-7 vs UCS-2 : pourquoi un emoji double votre facture SMS
Un seul emoji peut discrètement doubler ou tripler une facture SMS. GSM 03.38 définit deux encodages pour la charge utile de 140 octets : GSM-7 compact à 160 caractères, ou UCS-2 à 70. Tout caractère hors alphabet GSM-7 force le message entier en UCS-2. Développeurs et marketeurs qui collent du texte depuis un traitement de texte le découvrent souvent à l'arrivée des factures.
Empaquetage GSM-7 : 160 caractères dans 140 octets
Le SMS repose sur une charge utile user-data fixe de 140 octets. GSM 03.38 définit un alphabet 7 bits par défaut pour y loger 160 septets : 140 × 8 ÷ 7 = 160. Si le message reste dans cet alphabet, le terminal et le SMSC le traitent comme un segment unique jusqu'à 160 caractères. L'ensemble de base couvre lettres latines majuscules/minuscules, chiffres, ponctuation courante et quelques symboles monétaires ou nationaux. Espaces, sauts de ligne et prose anglaise usuelle passent sans pénalité.
La concaténation change le calcul. Les messages multi-parties insèrent un User Data Header pour réassembler les segments. Un UDH typique de 7 octets consomme de l'espace septets et laisse 153 caractères utiles par segment en GSM-7. La facturation est presque toujours par segment, pas par message logique : un corps GSM-7 de 200 caractères devient deux segments facturables (153 + reste). Comprendre le partage 160/153 est la première étape pour anticiper le coût.
Table d'extension : caractères déjà à deux septets
GSM 03.38 définit également une table d'extension accessible par un septet d'échappement dédié. Des caractères tels que les crochets [ ], les accolades { }, le caret ^, le tilde ~, la barre verticale |, la barre oblique inversée \ et le signe euro ne font pas partie du jeu de base. Chacun d'eux est encodé comme échappement plus le point de code d'extension, si bien que chacun consomme deux des 160 (ou 153) septets disponibles. Un message qui paraît court à l'écran peut donc franchir une limite de segment plus tôt qu'un décompte naïf de caractères ne le laisse penser.
Le mécanisme d'échappement reste du GSM-7 ; il ne bascule pas en UCS-2. La distinction compte. Quelques euros ou crochets gardent l'empaquetage 7 bits efficace. Ce n'est que face à un point de code absent de l'alphabet de base et de la table d'extension que le message quitte le GSM-7. Jusque-là, chaque caractère, y compris les extensions à double coût, compte en septets dans la limite 160 ou 153.
| Classe de caractères | Septets consommés en GSM-7 |
|---|---|
| Alphabet de base (A-Z, a-z, 0-9, ponctuation courante) | 1 |
| Table d'extension ([ ] { } ^ ~ | \ et euro) | 2 (échappement + code) |
| Hors GSM 03.38 (emoji, guillemets courbes, la plupart des non-latins) | Force le message entier en UCS-2 |
Repli UCS-2 : un caractère hors alphabet réencode tout
Dès qu'un caractère est irreprésentable en GSM-7, l'encodeur bascule toute la user data en UCS-2 16 bits (unités UTF-16 du BMP). La charge de 140 octets ne tient plus que 70 caractères. Avec UDH de concaténation, la longueur utile tombe à 67 par segment. Pas de repli partiel : un emoji, un guillemet typographique, un tiret cadratin ou un caractère arabe, cyrillique, CJK ou autre réécrit le corps entier. Une phrase anglaise de 140 caractères (un segment GSM-7) devient trois segments UCS-2 avec un smiley ajouté.
Voilà le mécanisme de la facture surprise. Les marketeurs rédigent dans un traitement de texte, collent dans un outil SMS et introduisent à leur insu des guillemets courbes ou une espace insécable. Les développeurs qui interpolent noms utilisateurs ou titres produits injectent le même déclencheur. Le réencodage tout-ou-rien fait sauter le nombre de segments. La facturation multiplie par le nouveau total. Les tarifs tout compris publiés comme 0,0125 $ US par message, dès 0,004 $ dans 149 pays, rendent le calcul concret : chaque segment en plus est une charge pleine, pas un appoint fractionnaire.
| Encodage | Limite segment unique | Limite segment concaténé |
|---|---|---|
| GSM-7 (7 bits) | 160 caractères | 153 caractères |
| UCS-2 (16 bits) | 70 caractères | 67 caractères |
Pièges invisibles et écritures qui forcent l'UCS-2
Les traitements de texte remplacent apostrophes et guillemets droits par des formes courbes, les doubles traits d'union par des tirets cadratin, et insèrent des espaces insécables. Aucun de ces points de code n'est dans GSM 03.38. Un message identique à l'ASCII brut à l'écran peut voyager en UCS-2 et coûter plusieurs segments. Idem pour le copier-coller depuis des pages web ou outils de design riches en Unicode. Vérifier les points de code réels, pas les glyphes, est la seule défense fiable.
Le choix de langue est décisif. Anglais pur, français basique, allemand, espagnol et écritures latines proches restent en GSM-7 si les accents hors alphabet par défaut sont évités ou translittérés. Grec, cyrillique, arabe, hébreu, devanagari, thaï et CJK n'ont pas de mapping GSM-7 pour les lettres ordinaires : toute utilisation notable force l'UCS-2 sur tout le message. Un seul nom ou mot produit suffit. Tout emoji est hors GSM-7 par définition. Règle simple : caractère absent de l'ensemble de base ou d'extension GSM 03.38 = charge utile en 70/67.
Correctifs pratiques avant envoi
La translittération garde le GSM-7 au prix de la fidélité orthographique. Remplacer accents par ASCII proche, guillemets courbes par droits et tirets cadratin par traits d'union restaure souvent 160/153. Pour marques ou textes juridiques exacts, acceptez l'UCS-2 et budgétez plus de segments. Des contrôles pré-vol qui détectent les points de code hors GSM-7 et indiquent le total de segments sous les deux encodages donnent un signal de coût clair avant soumission au SMSC.
Pour les modèles, surveillez les champs variables : un nom client dans une autre écriture ou un titre avec emoji peut basculer silencieusement un modèle GSM-7. Nettoyez ou normalisez les collages rich-text. Préférez la ponctuation ASCII droite dans le copy SMS. S'il faut emoji ou non-latin, placez les frontières de segments UCS-2 sur des coupures naturelles et restez dans le moins de blocs de 67 caractères possible. Des compteurs sensibles aux segments qui basculent 160/153 et 70/67 selon l'alphabet détecté évitent l'essentiel des surprises. Les tarifs varient par opérateur et route ; les chiffres cités illustrent le modèle par segment, pas un tarif universel. L'incertitude demeure sur le rendu exact des caractères limites : testez sur appareils représentatifs si le message est important.
Questions fréquentes
- Pourquoi un seul emoji transforme-t-il mon SMS en plusieurs messages ?
- Tout caractère hors de l'alphabet GSM 03.38, y compris chaque emoji, force le message entier de GSM-7 en UCS-2. La charge utile de 140 octets ne contient plus que 70 caractères au lieu de 160 (67 au lieu de 153 en concaténation). Un corps qui tenait en un segment GSM-7 peut donc devenir deux ou trois segments UCS-2 ; la facturation est au segment.
- Les guillemets courbes et tirets cadratin changent-ils vraiment l'encodage SMS ?
- Oui. Guillemets typographiques courbes, tirets cadratin, tirets demi-cadratin et espaces insécables sont absents des jeux de base et d'extension GSM-7. Les coller depuis un traitement de texte ré-encode tout le message en UCS-2, faisant chuter la limite par segment de 160/153 à 70/67 même si le texte paraît inchangé à l'écran.
- Combien de caractères par SMS concaténé en GSM-7 versus UCS-2 ?
- En GSM-7, un segment concaténé contient 153 caractères après l'UDH typique de 7 octets. En UCS-2, le même en-tête laisse 67 caractères par segment. Limites monosegment : 160 en GSM-7 et 70 en UCS-2. C'est le nombre de segments, pas de messages logiques, qui détermine le coût.