9
votes

Messages SMS de caractères non ASCII codant

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

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

  • Certains caractères non ASCII sont codés sur un chargeur / 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'une seconde "ç", "ê", etc. ne consomme que 1 octet supplémentaire.

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


1 commentaires

C'est intéressant. J'ai récemment fait des tests sur un iPhone et un HTC EVO 4G, les deux téléphones américains. Leur logiciel est immédiatement basculé sur UCS-2 (codage fixe de caractères à 16 bits) lorsque j'ai entré non GSM-03.38 Les caractères 7 bits tels que Í, même si ce caractère peut être codé sous forme de deux caractères GSM à 7 bits 03.38. Dans mes tests, le téléphone ne m'a pas donné cette option.


3 Réponses :


10
votes

https://fr.wikipedia.org/wiki/sms#message_size

Dépend de l'encodage, SMS peut envoyer 160/140/70 caractères. Si l'un des caractères non ASCII est utilisé, tout le message devrait être codé dans UTF-16, d'où la "consommation" que vous avez vécue.


1 commentaires

Fermer, mais ce qui précède devrait lire "si l'un des caractères non-GSM-7 utilisés, l'ensemble du message devrait être codé dans UCS-2 [..]"



5
votes

Vous avez déjà la réponse de @timdream, mais simplement un point supplémentaire que certains des caractères étendus que vous mentionnez sont inclus dans l'alphabet GSM 7 bits en tant que caractères simples, certains sont codés dans GSM 7-Bit par une évasion supplémentaire. caractère (deux octets pour représenter ce caractère) et certains ne peuvent pas être codés du tout en GSM 7 bits et doivent être codés comme UTF-16 à la place.

La définition complète de l'alphabet est ici: http://www.unicode.org/public/mappings/etsi/gsm0338.txt

Notez la particularité particulière avec C-Cédilla - de ce fichier,

L'ETSI GSM 03.38 Spécification montre un C-Cédille en majuscule glyphe à 0x09. Cela peut être le résultat d'un affichage limité Capacités pour manipuler des caractères avec des descendants. Cependant, les L'intention de la couverture linguistique est clairement pour les minuscules c-cédilla, comme indiqué dans la cartographie ci-dessous. La cartographie pour C-Cédille en majuscule est montré dans une ligne commentée dans la table de cartographie.

Certains périphériques codent à la fois en C-Cédilla en majuscules et minuscules comme le même caractère codé (0x09).


0 commentaires

8
votes

@vicky et @timdream ont raison, sauf que je crois que c'est techniquement UCS-2 et non utf-16 que le téléphone utilise parfois, qui a une taille 16 bits fixe par caractère. UTF-16 utilise une largeur variable de deux ou quatre octets par caractère, en fonction du caractère codé. Cet article Wikipedia explique cela en détail. UCS-2 prend strictement le message jusqu'à 70 caractères au plus (160 octets). Bien que La description du consortium Unicode de UCS-2 est un peu déroutant, une poignée de sites autour Le Web traitant de SMS confirme que Wikipedia a raison.


2 commentaires

Je crois comprendre que UTF-16 utilise une largeur variable de 2 ou 4 octets par caractère (codes 1 ou 2 16 bits).


Merci @gurneyAlex. J'ai corrigé cela dans mon commentaire ci-dessus.