mart-e

La vie, Linux, la tartiflette...

Le nombre de caractère dans un SMS

Observez les deux messages en cours de rédaction ci dessous. En dehors d'un contenu d'une banalité consternante, on remarque une différence de caractères spéciaux (ç et ô) et surtout le nombre de message envoyé passant de un à deux. Plutôt que les 71 caractères introduits, on m'en comptabiliserait 257 ! Comment expliquer cette différence énorme ? Non pas par un complot des opérateurs mais par une question d'encodage de caractère.

[caption id="attachment_2690" align="aligncenter" width="300"] J'avoue j'étais un peu à court d'inspiration pour l'exemple...[/caption]

Un SMS servant, à la base, à s'assurer du status de certaines lignes inoccupées, on a utilisé un petit paquet de 128 bytes, augmenté à 140 par la suite (d'où l'abréviation de Short Message Service). Ces 140 bytes pouvant stocker du texte, l'on a choisi un encodage sur 7 bits. 140*8/7 = 160 caractères possibles dans un SMS. Seulement 7 bits n'étant pas très grand, on est limité à 2^7, 128 caractères différents. Ce set de caractères est défini par le standard au doux nom de GSM 03.38 et qui englobe, grosso modo, l'alphabet habituel ainsi que quelques caractères accentués et symboles.

Des caractères comme ç (mais pas Ç étrangement), ô, œ ou ñ n'entrant pas dans la table, l'on change l'encodage du simple 7 bits à du beau UCS-2 (ancêtre de UTF-16 à taille fixe). Cet encodage permet de mettre tout ce qu'on veut en utilisant les alphabets les plus exotiques possibles (SMS en Klingon ?) mais consomme désormais 16 bits par caractères. Dans notre paquet de 140 bytes, on est donc réduit à 70 caractères de 16 bits. Ce qui explique que vos messages sont beaucoup plus courts et que la facture peut monter avec le nombre croissant de messages.

Les messages en plusieurs parties ne sont d'ailleurs pas gratuit non plus. Pour pouvoir rassembler les messages par après, on va ajouter un entête (le User Data Header) de 6 bytes (description des champs) qui va empiéter sur la longueur du message. (140 - 6)*8/7 = 153.14... Donc, lorsque vos messages deviennent trop long, on vous facturera un SMS tout les 153 caractères "normaux" ou tout les 67 caractères si un caractère spécial est présent.

Mon message de 71 caractères est donc comptabilisé comme ceci :

 <-6-> <-------------------------134------------------------------------->
| UDP |Salut! Comment ça va ? Quoi de neuf depuis la dernière fois ? A bie|
| UDP |ntôt|///////////////////////////////////////////////////////////////

Pas de complot vous poussant à adopter une mauvaise orthographe, une simple question d'encodage...