9 votes

Encodage des caractères non ASCII des messages SMS

J'ai un téléphone Nokia N900, et lors de l'envoi d'un SMS, le widget affiche le nombre de caractères restants dans le message (et le nombre de messages courts nécessaires pour envoyer le message complet).

Je vis en France, où j'ai remarqué la chose suivante en écrivant des messages avec des caractères non ASCII :

  • certains caractères non ASCII sont codés sur un caractère/octet, par exemple "é", "è", "à", "ù"
  • la présence de certains caractères non ASCII tels que "ç", "ê", "ô" consomme une quantité fixe de 90 caractères/octets + 1 octet par caractère
  • la présence d'un deuxième "ç", "ê", etc. ne consomme qu'un octet supplémentaire.

Je me demande donc comment les messages sont encodés, car je ne vois pas le schéma ci-dessus correspondre aux encodages traditionnels que je connais (iso-8859-1, UTF-8, UTF-16...).

10voto

timdream Points 2930

https://en.wikipedia.org/wiki/SMS#Message_size

En fonction de l'encodage, le SMS peut envoyer 160/140/70 caractères. Si l'un des caractères non ASCII est utilisé, l'ensemble du message devra être encodé en UTF-16, d'où la "consommation" que vous avez constatée.

8voto

hotshot309 Points 874

@Vicky et @timdream ont raison, sauf que je crois que c'est techniquement NGC-2 et non UTF-16 que le téléphone utilise parfois, qui a une taille fixe de 16 bits par caractère. L'UTF-16 utilise une largeur variable de deux ou quatre octets par caractère, en fonction du caractère encodé. Cet article de Wikipedia explique cela en détail. UCS-2 réduit strictement le message à 70 caractères au maximum (160 octets). Bien que la description de l'UCS-2 par le Consortium Unicode est un peu déroutant, une poignée de sites web traitant des SMS confirment que Wikipédia a raison.

5voto

Vicky Points 6749

Vous avez déjà reçu la réponse de @timdream, mais je tiens à préciser que certains des caractères étendus que vous mentionnez sont inclus dans l'alphabet GSM 7 bits en tant que caractères uniques, que certains sont encodés en GSM 7 bits par le biais d'un caractère d'échappement supplémentaire (donc deux octets pour représenter ce caractère) et que certains ne peuvent pas être encodés du tout en GSM 7 bits et doivent être encodés en UTF-16 à la place.

La définition complète de l'alphabet est disponible ici : http://www.unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT

Notez la particularité de la cédille - de ce dossier,

La spécification ETSI GSM 03.38 montre un glyphe C-cédille majuscule à 0x09. en majuscule à 0x09. Cela peut être le résultat de capacités d'affichage d'affichage pour traiter les caractères avec des jambages. Cependant, [ ] l'intention de la couverture linguistique est clairement pour la minuscule c-cédille minuscule, comme le montre dans la correspondance ci-dessous. La correspondance pour le C-cédille majuscule est la suivante indiquée dans une ligne commentée du tableau de correspondance.

Certains dispositifs codent le c-cédille majuscule et le c-cédille minuscule comme le même caractère codé (0x09).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X