GSM-7 vs UCS-2: varför en emoji fördubblar din SMS-kostnad

En enda emoji kan i tysthet fördubbla eller tredubbla en SMS-räkning. GSM 03.38 definierar två kodningar för den 140-byte stora payloaden: kompakt GSM-7 med 160 tecken, eller UCS-2 med 70. Varje tecken utanför GSM-7-alfabetet tvingar hela meddelandet till UCS-2. Utvecklare och marknadsförare som klistrar in text från ordbehandlare upptäcker ofta detta först när fakturorna kommer.

GSM-7-packning: 160 tecken i en 140-byte payload

SMS designades kring en fast 140-byte user-data-payload. GSM 03.38 definierar ett 7-bitars standardalfabet så att dessa 140 byte rymmer 160 septetter: 140 gånger 8 delat med 7 blir 160. När ett meddelande håller sig helt inom det alfabetet behandlar handenheten och SMSC det som ett enda segment på upp till 160 tecken. Basuppsättningen täcker stora och små latinska bokstäver, siffror, vanlig interpunktion och en handfull valuta- och nationella symboler. Mellanslag, radbrytningar och vanliga tecken i engelsk löptext får plats utan extra kostnad.

Konkatenering ändrar aritmetiken. Flerdelsmeddelanden infogar en User Data Header så att mottagaren kan sätta ihop segmenten i ordning. En typisk 6-byte UDH förbrukar septettutrymme och lämnar 153 tecken användbar text per segment under GSM-7. Fakturering sker nästan alltid per segment, inte per logiskt meddelande, så en GSM-7-kropp på 200 tecken blir två debiterbara segment (153 plus resten). Att förstå uppdelningen 160 mot 153 är första steget för att förutse kostnaden innan du skickar.

Extensionstabellen: tecken som redan kostar två septetter

GSM 03.38 definierar också en utökningstabell som nås via en dedikerad escape-septett. Tecken som hakparenteser [ ], klammerparenteser { }, cirkumflex ^, tilde ~, vertikalt streck |, bakstreck \ och eurosymbolen ingår inte i grunduppsättningen. Var och en av dem kodas som escape plus utökningskodpunkten, så var och en förbrukar två av de 160 (eller 153) tillgängliga septetterna. Ett meddelande som ser kort ut på skärmen kan därför korsa en segmentgräns tidigare än en naiv teckenräkning antyder.

Escape-mekanismen är fortfarande GSM-7; den växlar inte meddelandet till UCS-2. Den skillnaden spelar roll. Du kan ta med några eurotecken eller hakparenteser och stanna i den effektiva 7-bitars packningen. Först när kodaren stöter på en kodpunkt som varken finns i basalfabetet eller extensionstabellen lämnar hela meddelandet GSM-7. Fram till dess räknas varje tecken, inklusive de dubbelkostande utökningstecknen, fortfarande i septetter mot gränsen 160 eller 153.

TeckenklassSeptetter förbrukade under GSM-7
Basalfabet (A-Z, a-z, 0-9, vanlig interpunktion)1
Utökningstabell ([ ] { } ^ ~ | \ och euro)2 (escape-tecken + kod)
Allt utanför GSM 03.38 (emoji, böjda citattecken, de flesta icke-latinska)Tvingar hela meddelandet till UCS-2

UCS-2-fallback: ett tecken utanför alfabetet omkodar allt

I det ögonblick något tecken inte kan representeras i GSM-7 växlar kodaren hela användardata till 16-bitars UCS-2 (effektivt UTF-16-kodeneheter för BMP). Samma 140-byte payload rymmer då bara 70 tecken. Med en konkatenerings-UDH sjunker den användbara längden till 67 tecken per segment. Det finns ingen partiell fallback: en enda emoji, ett böjt citattecken, ett tankstreck eller ett tecken från arabiska, kyrilliska, CJK eller de flesta andra skriftsystem skriver om hela kroppen. En engelsk mening på 140 tecken som var ett GSM-7-segment blir tre UCS-2-segment när ett leende ansikte läggs till.

Detta är mekanismen bakom överraskningsfakturan. Marknadsförare utarbetar ofta text i en ordbehandlare, klistrar in den i ett SMS-verktyg och introducerar omedvetet böjda citattecken eller hårda mellanslag. Utvecklare som interpolerar användargenererade namn eller produkttitlar kan injicera samma osynliga utlösare. Eftersom omkodningen är allt-eller-inget hoppar segmentantalet diskontinuerligt. Faktureringen multipliceras med det nya segmenttotalet. Publicerade allt-i-ett-siffror som US $0,0125 per meddelande, med priser från $0,004 över 149 länder, gör aritmetiken konkret: varje extra segment är en ny full avgift, inte ett bråkdelstillägg.

KodningGräns för enskilt segmentGräns för konkatenerat segment
GSM-7 (7-bit)160 tecken153 tecken
UCS-2 (16-bit)70 tecken67 tecken

Osynliga fällor och skriftsystem som tvingar UCS-2

Ordbehandlare ersätter rutinmässigt raka apostrofer och citattecken med böjda typografiska former, omvandlar dubbla bindestreck till tankstreck och infogar hårda mellanslag. Inga av dessa kodpunkter tillhör GSM 03.38. Ett meddelande som ser identiskt ut med en ren ASCII-version på skärmen kan därför skickas som UCS-2 och kosta flera segment. Detsamma gäller inklistrat innehåll från webbsidor eller designverktyg som gynnar rikare Unicode. Att kontrollera de faktiska kodpunkterna, inte de renderade glyferna, är det enda tillförlitliga försvaret.

Språkvalet är lika avgörande. Ren engelska, grundläggande franska, tyska, spanska och liknande latinska meddelanden stannar vanligtvis i GSM-7 om accenterade bokstäver utanför standardalfabetet undviks eller translittereras. Grekiska, kyrilliska, arabiska, hebreiska, devanagari, thailändska och CJK-familjen har ingen GSM-7-mappning för vanliga bokstäver, så all betydande användning av dessa skriftsystem tvingar UCS-2 för hela meddelandet. Även ett enda namn eller produktord i de skriftsystemen räcker. Emoji av alla slag ligger utanför GSM-7 per definition. Den praktiska regeln är enkel: om tecknet inte finns i GSM 03.38:s bas- eller extension-uppsättning blir hela payloaden 70/67.

Praktiska åtgärder innan du skickar

Translitterering håller meddelanden i GSM-7 till priset av ortografisk trohet. Att ersätta accenterade tecken med närmaste ASCII-motsvarigheter, konvertera böjda citattecken till raka och mappa tankstreck tillbaka till bindestreck återställer ofta gränserna 160/153. För varumärken eller juridisk text som måste förbli exakt, acceptera UCS-2 och budgetera för det högre segmentantalet. Automatiserade förkontroller som skannar efter icke-GSM-7-kodpunkter och rapporterar det resulterande segmenttotalet under båda kodningarna ger utvecklare och marknadsförare en tydlig kostnadssignal innan meddelandet skickas till SMSC.

När du bygger mallar, håll variabelfält under uppsikt: ett kundnamn i ett annat skriftsystem eller en produkttitel med en emoji kan tyst växla en annars GSM-7-mall. Rensa eller normalisera inklistringsbuffertar från källor med formaterad text. Föredra rak ASCII-interpunktion i marknadstext avsedd för SMS. Om du måste skicka emoji eller icke-latinsk text, utforma kroppen så att UCS-2-segmentgränserna hamnar på naturliga frasbrytningar och håll total längd inom så få 67-teckenssegment som möjligt. Segmentmedvetna längdräknare som växlar visning mellan 160/153 och 70/67 beroende på det detekterade alfabetet tar bort det mesta av överraskningen. Priser varierar per operatör och rutt; de publicerade siffrorna som nämnts tidigare illustrerar per-segment-modellen snarare än en universell taxa. Ärlig osäkerhet kvarstår kring exakt återgivning av gränstecken i handenheten, så testa på representativa enheter när meddelandet är viktigt.

Vanliga frågor

Varför blir mitt SMS flera meddelanden av en enda emoji?
Alla tecken utanför GSM 03.38-alfabetet, inklusive varje emoji, tvingar hela meddelandet från GSM-7 till UCS-2. Den 140-byte stora payloaden rymmer då 70 tecken i stället för 160 (67 i stället för 153 vid sammanslagning). En text som rymdes i ett GSM-7-segment kan därför bli två eller tre UCS-2-segment, och debitering sker per segment.
Ändrar böjda citattecken och tankstreck verkligen SMS-kodning?
Ja. Typografiska lockiga citattecken, tankstreck, kort tankstreck och hårda mellanslag ingår inte i GSM-7:s grund- eller utökningsuppsättningar. Om du klistrar in dem från en ordbehandlare kodas hela meddelandet om som UCS-2, vilket sänker gränsen per segment från 160/153 till 70/67 även om texten ser oförändrad ut på skärmen.
Hur många tecken ryms i ett sammanslaget SMS under GSM-7 kontra UCS-2?
Under GSM-7 rymmer ett sammanslaget segment 153 tecken efter den typiska 6-byte UDH. Under UCS-2 lämnar samma header 67 tecken per segment. Gränser för enskilda segment är 160 för GSM-7 och 70 för UCS-2. Segmentantalet, inte det logiska meddelandeantalet, styr kostnaden.

Relaterat