GSM-7 vs UCS-2: perché un emoji raddoppia la bolletta SMS

Un solo emoji può raddoppiare o triplicare silenziosamente una bolletta SMS. GSM 03.38 definisce due codifiche per il payload da 140 byte: GSM-7 compatto a 160 caratteri, oppure UCS-2 a 70. Qualsiasi carattere fuori dall'alfabeto GSM-7 forza l'intero messaggio in UCS-2. Sviluppatori e marketer che incollano testi da word processor spesso se ne accorgono solo alla fattura.

Impacchettamento GSM-7: 160 caratteri in un payload da 140 byte

Gli SMS sono nati attorno a un payload user-data fisso di 140 byte. GSM 03.38 definisce un alfabeto predefinito a 7 bit così che quei 140 byte contengano 160 settetti: 140 per 8 diviso 7 fa 160. Se il messaggio resta interamente in quell'alfabeto, handset e SMSC lo trattano come un singolo segmento fino a 160 caratteri. Il set base copre lettere latine maiuscole e minuscole, cifre, punteggiatura comune e alcuni simboli di valuta e nazionali. Spazi, a capo e i caratteri tipici della prosa inglese rientrano senza penali.

La concatenazione cambia l'aritmetica. I messaggi multi-parte inseriscono un User Data Header così il dispositivo ricevente può riassemblare i segmenti in ordine. Un UDH tipico da 6 byte consuma spazio a settetti, lasciando 153 caratteri di testo utile per segmento in GSM-7. La fatturazione è quasi sempre per segmento, non per messaggio logico, quindi un body GSM-7 di 200 caratteri diventa due segmenti fatturabili (153 più il resto). Capire lo split 160 contro 153 è il primo passo per stimare il costo prima di inviare.

Tabella di estensione: caratteri che già costano due settetti

GSM 03.38 definisce anche una tabella di estensione raggiungibile tramite un septet di escape dedicato. Caratteri come le parentesi quadre [ ], le parentesi graffe { }, l'accento circonflesso ^, la tilde ~, la barra verticale |, la barra rovesciata \ e il simbolo dell'euro non appartengono al set di base. Ognuno di essi viene codificato come escape più il codepoint di estensione, quindi consuma due dei 160 (o 153) septet disponibili. Un messaggio che a schermo sembra breve può quindi superare il confine di un segmento prima di quanto suggerirebbe un conteggio dei caratteri ingenuo.

Il meccanismo di escape resta GSM-7; non fa passare il messaggio in UCS-2. La distinzione conta. Puoi includere qualche euro o parentesi e restare nel packing efficiente a 7 bit. Solo quando l'encoder incontra un codepoint assente sia dall'alfabeto base sia dalla tabella di estensione l'intero messaggio esce da GSM-7. Fino a quel momento ogni carattere, inclusi quelli di estensione a doppio costo, viene ancora contato in settetti rispetto al limite 160 o 153.

Classe di caratteriSettetti consumati in GSM-7
Alfabeto base (A–Z, a–z, 0–9, punteggiatura comune)1
Tabella di estensione ([ ] { } ^ ~ | \ e euro)2 (carattere di escape + codice)
Qualsiasi cosa fuori da GSM 03.38 (emoji, virgolette curve, gran parte del non latino)Forza l'intero messaggio in UCS-2

Fallback UCS-2: un carattere fuori alfabeto ricodifica tutto

Nel momento in cui un carattere non è rappresentabile in GSM-7, l'encoder passa l'intero user data a UCS-2 a 16 bit (di fatto unità di codice UTF-16 per il BMP). Lo stesso payload da 140 byte contiene allora solo 70 caratteri. Con un UDH di concatenazione la lunghezza utile scende a 67 caratteri per segmento. Non esiste un fallback parziale: un solo emoji, una virgoletta tipografica, un trattino medio o un carattere arabo, cirillico, CJK o gran parte degli altri script riscrive tutto il body. Una frase inglese di 140 caratteri che era un segmento GSM-7 diventa tre segmenti UCS-2 non appena si aggiunge una faccina sorridente.

Questo è il meccanismo dietro la bolletta a sorpresa. I marketer spesso mettono in bozza il copy in un word processor, lo incollano in uno strumento SMS e introducono inconsapevolmente virgolette curve o uno spazio non divisibile. Gli sviluppatori che interpolano nomi generati dagli utenti o titoli di prodotto possono iniettare lo stesso trigger invisibile. Poiché la ricodifica è tutto o niente, il conteggio segmenti salta in modo discontinuo. La fatturazione si moltiplica per il nuovo totale di segmenti. Tariffe all-in pubblicate come US $0.0125 per messaggio, con tariffe da $0.004 in 149 paesi, rendono concreta l'aritmetica: ogni segmento extra è un altro addebito pieno, non un add-on frazionario.

CodificaLimite segmento singoloLimite segmento concatenato
GSM-7 (7-bit)160 caratteri153 caratteri
UCS-2 (16-bit)70 caratteri67 caratteri

Trappole invisibili e script che forzano UCS-2

I word processor sostituiscono di routine apostrofi e virgolette dritti con forme tipografiche curve, trasformano i doppi trattini in em dash e inseriscono spazi non divisibili. Nessuno di quei codepoint appartiene a GSM 03.38. Un messaggio che a schermo sembra identico a una versione plain-ASCII può quindi viaggiare come UCS-2 e costare più segmenti. Lo stesso vale per contenuti copincollati da pagine web o tool di design che prediligono Unicode più ricco. Controllare i codepoint reali, non i glifi renderizzati, è l'unica difesa affidabile.

La scelta della lingua è altrettanto decisiva. Messaggi in inglese puro, francese base, tedesco, spagnolo e simili script latini restano di solito in GSM-7 se si evitano o si traslitterano le lettere accentate fuori dall'alfabeto predefinito. Greco, cirillico, arabo, ebraico, devanagari, thai e la famiglia CJK non hanno mappatura GSM-7 per le lettere ordinarie, quindi qualsiasi uso sostanziale di quegli script forza UCS-2 per l'intero messaggio. Basta anche un solo nome o parola di prodotto in quegli script. Gli emoji di ogni tipo stanno fuori da GSM-7 per definizione. La regola pratica è semplice: se il carattere non è nel set base o di estensione GSM 03.38, l'intero payload diventa 70/67.

Correzioni pratiche prima di inviare

La traslitterazione tiene i messaggi in GSM-7 a costo della fedeltà ortografica. Sostituire i caratteri accentati con gli equivalenti ASCII più vicini, convertire le virgolette curve in dritti e mappare gli em dash di nuovo in trattini spesso ripristina i limiti 160/153. Per nomi di brand o testi legali che devono restare esatti, accetta UCS-2 e metti in budget il conteggio segmenti più alto. Controlli pre-flight automatici che scansionano i codepoint non GSM-7 e riportano il totale segmenti risultante sotto entrambe le codifiche danno a sviluppatori e marketer un segnale di costo chiaro prima dell'invio all'SMSC.

Quando costruisci template, tieni sotto controllo i campi variabili: un nome cliente in un altro script o un titolo prodotto con un emoji può silenziosamente far passare in UCS-2 un template altrimenti GSM-7. Pulisci o normalizza i buffer di incolla da fonti rich-text. Preferisci punteggiatura ASCII dritta nel copy marketing destinato agli SMS. Se devi inviare emoji o testo non latino, progetta il body così che i confini di segmento UCS-2 cadano su pause naturali di frase e tieni la lunghezza totale nel minor numero possibile di chunk da 67 caratteri. Contatori di lunghezza consapevoli dei segmenti che commutano il display tra 160/153 e 70/67 in base all'alfabeto rilevato eliminano gran parte delle sorprese. Le tariffe variano per carrier e route; le tariffe pubblicate citate prima illustrano il modello per segmento piuttosto che una tariffa universale. Resta un'incertezza onesta sul rendering esatto di caratteri di bordo sugli handset, quindi testa su dispositivi rappresentativi quando il messaggio conta.

Domande frequenti

Perché un'emoji trasforma il mio SMS in più messaggi?
Qualsiasi carattere fuori dall'alfabeto GSM 03.38, emoji incluse, forza l'intero messaggio da GSM-7 a UCS-2. Il payload da 140 byte contiene allora 70 caratteri invece di 160 (67 invece di 153 se concatenato). Un testo che stava in un segmento GSM-7 può diventare due o tre segmenti UCS-2, e si fattura per segmento.
Virgolette curve e trattini lunghi cambiano davvero la codifica SMS?
Sì. Virgolette tipografiche curve, trattini lunghi, trattini medi e spazi non divisibili non sono nei set base o di estensione GSM-7. Incollarli da un word processor ricodifica tutto il messaggio in UCS-2, abbassando il limite per segmento da 160/153 a 70/67 anche se a schermo il testo sembra uguale.
Quanti caratteri entrano in un SMS concatenato con GSM-7 rispetto a UCS-2?
Con GSM-7 un segmento concatenato contiene 153 caratteri dopo il tipico UDH da 6 byte. Con UCS-2 lo stesso header lascia 67 caratteri per segmento. I limiti monosegmento sono 160 per GSM-7 e 70 per UCS-2. È il numero di segmenti, non i messaggi logici, a determinare il costo.

Correlati