UCS-2 est l'encodage 16 bits que le SMS utilise pour tout texte contenant des caractères hors de l'alphabet GSM-7 — écritures non latines, emoji, guillemets courbes. Chaque caractère prend deux octets, si bien qu'un SMS UCS-2 unique contient 70 caractères et que les segments concaténés en contiennent 67 chacun. Un seul caractère hors GSM-7 force tout le message en UCS-2.
Pourquoi le SMS a besoin de l'UCS-2
Le GSM-7 ne couvre que 128 caractères plus un petit jeu d'extension. Tout le reste — arabe, chinois, cyrillique, hébreu, thaï, emoji, et même des caractères typographiques comme les guillemets courbes et les demi-cadratins — n'est pas représentable. Pour ceux-là, le SMS bascule en UCS-2, un encodage 16 bits à largeur fixe (de fait UTF-16 big-endian pour le Plan Multilingue de Base). Il est signalé par data_coding 0x08.
Capacité : 70 et 67
Le champ de données utilisateur du SMS fait 140 octets. À deux octets par caractère, l'UCS-2 tient 70 caractères dans un message unique. Lorsqu'un message est concaténé, le User Data Header de 6 octets consomme de la charge utile, laissant 134 octets — 67 caractères par segment. C'est moins de la moitié de la capacité du GSM-7, d'où l'impact important du choix d'encodage sur le coût.
| Encodage | SMS simple | Par segment concaténé |
|---|---|---|
| GSM-7 (7-bit) | 160 caractères | 153 caractères |
| Binaire 8 bits | 140 octets | 134 octets |
| UCS-2 (16-bit) | 70 caractères | 67 caractères |
Ce qui déclenche l'UCS-2
L'encodage est tout ou rien par message : un seul caractère hors GSM-7 force le message entier en UCS-2, faisant chuter la capacité de 160 à 70. Les coupables courants s'introduisent facilement par inadvertance — une apostrophe courbe issue d'un traitement de texte, un tiret cadratin, un emoji, ou un nom non latin. Détecter ces caractères avant l'envoi est le plus grand levier sur le coût du SMS.
| Catégorie | Exemples |
|---|---|
| Emoji | 😀 ✅ 🚀 ❤️ |
| Ponctuation typographique | ' ' “ ” – — … |
| Scripts non latins | العربية · 中文 · Кириллица · עברית · ไทย |
| Lettres accentuées non présentes dans GSM-7 | â ê î ô û ã õ ą ę ř |
La subtilité des paires de substitution
L'UCS-2 est strictement 16 bits et couvre le Plan Multilingue de Base de l'Unicode. Les caractères au-delà de U+FFFF — de nombreux emoji modernes, par exemple — sont représentés en UTF-16 par des paires de substitution de deux unités de code 16 bits, si bien qu'un tel emoji consomme quatre octets (deux « caractères » UCS-2). Un message qui ressemble à un seul emoji peut donc compter pour deux dans la limite de 70/67.
Questions fréquemment posées
Combien de caractères tiennent dans un SMS Unicode ?
70 caractères dans un message UCS-2 unique, et 67 par segment lorsque le message est concaténé. C'est parce que chaque caractère fait 16 bits (deux octets) face à la limite de 140 octets de charge utile du SMS.
Qu'est-ce qui fait basculer un SMS en UCS-2 ?
Tout caractère unique hors de l'alphabet GSM-7 — un emoji, un guillemet courbe, un tiret cadratin ou du texte non latin — force le message entier en UCS-2. L'encodage est choisi par message, pas par caractère.
L'UCS-2 est-il identique à l'UTF-16 ?
Presque. L'UCS-2 est à 16 bits fixes et couvre le Plan Multilingue de Base. Le SMS traite la charge utile comme de l'UTF-16 big-endian, si bien que les caractères au-delà de U+FFFF (de nombreux emoji) deviennent des paires de substitution et prennent quatre octets.
Pourquoi un emoji compte-t-il parfois pour deux caractères ?
Les emoji au-delà de U+FFFF sont encodés en paires de substitution UTF-16 — deux unités de code 16 bits — si bien qu'un seul glyphe consomme deux des 70 (ou 67) emplacements de caractère UCS-2 disponibles.
Comment éviter d'envoyer de l'UCS-2 par inadvertance ?
Nettoyez l'entrée avant l'envoi : remplacez les guillemets et tirets typographiques par leurs équivalents ASCII, supprimez ou translittérez les accents parasites, et repérez les emoji. Un vérificateur GSM-7/Unicode signale les caractères exacts qui forcent l'UCS-2.
Spécifications sources
Les normes publiées sur lesquelles repose cette page. S'ouvre dans un nouvel onglet.