GSM-7 vs UCS-2: proč jeden emoji zdvojnásobí cenu SMS
Jeden emoji může tiše zdvojnásobit nebo ztrojnásobit cenu SMS. GSM 03.38 definuje dvě kódování pro 140bajtový payload: kompaktní GSM-7 na 160 znaků, nebo UCS-2 na 70. Jakýkoli znak mimo abecedu GSM-7 přepne celou zprávu do UCS-2. Vývojáři a marketéři, kteří vkládají text z textových procesorů, to často zjistí až s fakturou.
Balení GSM-7: 160 znaků v 140bajtovém payloadu
SMS vznikla kolem pevného 140bajtového user-data payloadu. GSM 03.38 definuje 7bitovou výchozí abecedu, aby těch 140 bajtů pojalo 160 septetů: 140krát 8 děleno 7 je 160. Zůstane-li zpráva celá v této abecedě, telefon i SMSC ji berou jako jeden segment až 160 znaků. Základní sada pokrývá velká i malá latinská písmena, číslice, běžnou interpunkci a několik měnových a národních symbolů. Mezery, nové řádky i běžné anglické znaky se vejdou bez penalizace.
Zřetězení mění aritmetiku. Vícedílné zprávy vkládají User Data Header, aby přijímač mohl segmenty složit ve správném pořadí. Typická 6bajtová UDH spotřebuje místo v septetech a pod GSM-7 zbývá 153 použitelných znaků na segment. Účtování je téměř vždy za segment, ne za logickou zprávu, takže 200znakové tělo GSM-7 jsou dva účtované segmenty (153 plus zbytek). Pochopení rozdělení 160 vs. 153 je první krok k odhadu nákladů před odesláním.
Rozšiřující tabulka: znaky, které už stojí dva septety
GSM 03.38 také definuje rozšiřující tabulku, ke které se přistupuje vyhrazeným escape septetem. Znaky jako hranaté závorky [ ], složené závorky { }, stříška ^, vlnovka ~, svislá čára |, zpětné lomítko \ a znak eura nejsou v základní sadě. Každý z nich se kóduje jako escape plus kódový bod rozšíření, takže každý spotřebuje dva ze 160 (nebo 153) dostupných septetů. Zpráva, která na obrazovce vypadá krátce, proto může překročit hranici segmentu dříve, než by naznačoval naivní počet znaků.
Escape sekvence zůstává v GSM-7; zprávu do UCS-2 nepřepíná. Tento rozdíl je zásadní. Můžete vložit pár euro nebo závorek a zůstat u efektivního 7bitového balení. Teprve když enkodér narazí na kódový bod, který není ani v základní abecedě, ani v rozšiřující tabulce, celá zpráva opustí GSM-7. Do té chvíle se každý znak včetně dražších rozšiřujících počítá v septetech proti limitu 160 nebo 153.
| Třída znaků | Spotřeba septetů pod GSM-7 |
|---|---|
| Základní abeceda (A–Z, a–z, 0–9, běžná interpunkce) | 1 |
| Extension table ([ ] { } ^ ~ | \ and euro) | 2 (escape + kód) |
| Cokoli mimo GSM 03.38 (emoji, typografické uvozovky, většina nelatinky) | Vynutí UCS-2 pro celou zprávu |
Fallback UCS-2: jeden znak mimo abecedu překóduje vše
Jakmile nelze nějaký znak vyjádřit v GSM-7, enkodér přepne celá uživatelská data na 16bitové UCS-2 (efektivně UTF-16 kódové jednotky pro BMP). Stejný 140bajtový payload pak pojme jen 70 znaků. S konkatenční UDH klesne použitelná délka na 67 znaků na segment. Částečný fallback neexistuje: jediný emoji, chytrá uvozovka, en dash nebo znak z arabštiny, cyrilice, CJK či většiny jiných písem přepíše celé tělo. Anglická věta o 140 znacích, která byla jeden segment GSM-7, se po přidání usměvavého obličeje stane třemi segmenty UCS-2.
To je mechanismus překvapivé faktury. Marketéři často připraví text v textovém procesoru, vloží ho do SMS nástroje a nevědomky zavedou typografické uvozovky nebo nezlomitelnou mezeru. Vývojáři, kteří interpolují uživatelská jména nebo názvy produktů, mohou stejným způsobem vložit neviditelný spouštěč. Protože překódování je všechno nebo nic, počet segmentů skočí nespojitě. Účtování se násobí novým součtem segmentů. Zveřejněné celkové částky jako 0,0125 USD za zprávu se sazbami od 0,004 $ ve 149 zemích konkretizují aritmetiku: každý další segment je další plná cena, ne zlomkový příplatek.
| Kódování | Limit jednoho segmentu | Limit zřetězeného segmentu |
|---|---|---|
| GSM-7 (7bit) | 160 znaků | 153 znaků |
| UCS-2 (16bit) | 70 znaků | 67 znaků |
Neviditelné pasti a písma, která vynucují UCS-2
Textové procesory běžně nahrazují rovné apostrofy a uvozovky kudrnatými typografickými tvary, mění dvojité pomlčky na em dash a vkládají nezalomitelné mezery. Žádný z těchto kódových bodů nepatří do GSM 03.38. Zpráva, která na obrazovce vypadá stejně jako plain-ASCII verze, proto může jet jako UCS-2 a stát několik segmentů. Totéž platí pro obsah zkopírovaný z webů nebo designových nástrojů, které preferují bohatší Unicode. Kontrola skutečných kódových bodů, ne vykreslených glyfů, je jediná spolehlivá obrana.
Volba jazyka je stejně rozhodující. Čistá angličtina, základní francouzština, němčina, španělština a podobné latinkové zprávy obvykle zůstanou v GSM-7, pokud se vyhneme nebo přepíšeme diakritiku mimo výchozí abecedu. Řečtina, cyrilice, arabština, hebrejština, dévanágarí, thajština a rodina CJK nemají mapování GSM-7 pro běžná písmena, takže jakékoli podstatné použití těchto písem vynutí UCS-2 pro celou zprávu. Stačí jediné jméno nebo produktové slovo v těchto písmech. Emoji všech druhů leží mimo GSM-7 z definice. Praktické pravidlo je jednoduché: není-li znak v základní nebo rozšiřující sadě GSM 03.38, celý payload je 70/67.
Praktické opravy před odesláním
Transliterace drží zprávy v GSM-7 za cenu ortografické věrnosti. Nahrazení diakritiky nejbližšími ASCII ekvivalenty, převod kudrnatých uvozovek na rovné a mapování em dash zpět na pomlčky často obnoví limity 160/153. U značek nebo právního textu, který musí zůstat přesný, přijměte UCS-2 a počítejte s vyšším počtem segmentů. Automatické kontroly před odesláním, které hledají kódové body mimo GSM-7 a hlásí výsledný počet segmentů pod oběma kódováními, dají vývojářům i marketérům jasný cenový signál před odesláním na SMSC.
Při tvorbě šablon bedlivě hlídejte proměnná pole: jméno zákazníka v jiném písmu nebo název produktu s emoji může tiše překlopit jinak GSM-7 šablonu. Odstraňte nebo normalizujte text ze schránky a ze zdrojů s formátovaným textem. V marketingových textech pro SMS preferujte rovnou ASCII interpunkci. Musíte-li poslat emoji nebo nelatinský text, navrhujte tělo tak, aby hranice segmentů UCS-2 padaly na přirozené předěly frází a celková délka zůstala v co nejméně 67znakových blocích. Počitadla délky citlivá na segmenty, která přepínají zobrazení mezi 160/153 a 70/67 podle detekované abecedy, odstraní většinu překvapení. Sazby se liší podle operátora a trasy; dříve citované zveřejněné údaje ilustrují model za segment, nikoli univerzální tarif. U přesného vykreslení okrajových znaků na mobilních telefonech zůstává oprávněná nejistota, proto u důležitých zpráv testujte na reprezentativních zařízeních.
Časté dotazy
- Proč přidání jednoho emoji změní mou SMS na více zpráv?
- Jakýkoli znak mimo abecedu GSM 03.38, včetně každého emoji, vynutí překódování celé zprávy z GSM-7 do UCS-2. 140bajtový payload pak pojme 70 znaků místo 160 (67 místo 153 při zřetězení). Text, který se vešel do jednoho segmentu GSM-7, se tak může stát dvěma nebo třemi segmenty UCS-2 a účtování probíhá za segment.
- Opravdu mění typografické uvozovky a pomlčky kódování SMS?
- Ano. Typografické uvozovky, dlouhé pomlčky, krátké pomlčky a nezlomitelné mezery nejsou v základní ani rozšiřující sadě GSM-7. Jejich vložení z textového procesoru překóduje celou zprávu do UCS-2 a sníží limit na segment z 160/153 na 70/67, i když text na obrazovce vypadá beze změny.
- Kolik znaků se vejde do zřetězené SMS v GSM-7 versus UCS-2?
- V GSM-7 pojme zřetězený segment 153 znaků po typické 6bajtové UDH. V UCS-2 stejná hlavička nechá 67 znaků na segment. Limity pro jeden segment jsou 160 pro GSM-7 a 70 pro UCS-2. Náklady určuje počet segmentů, nikoli počet logických zpráv.