GSM-7 vs UCS-2: hvorfor én emoji fordobler din SMS-regning

Én emoji kan stille fordoble eller tredoble en SMS-regning. GSM 03.38 definerer to indkodninger til 140-byte-payloaden: kompakt GSM-7 med 160 tegn, eller UCS-2 med 70. Ethvert tegn uden for GSM-7-alfabetet tvinger hele beskeden over i UCS-2. Udviklere og marketingsfolk, der indsætter tekst fra tekstbehandlere, opdager det ofte først, når fakturaerne lander.

GSM-7-pakning: 160 tegn i en 140-byte-payload

SMS er designet omkring en fast 140-byte user-data-payload. GSM 03.38 definerer et 7-bit standardalfabet, så de 140 bytes kan rumme 160 septetter: 140 gange 8 divideret med 7 er 160. Når en besked holder sig helt inden for det alfabet, behandler håndsæt og SMSC den som ét segment på op til 160 tegn. Grundsættet dækker store og små latinske bogstaver, cifre, almindelig tegnsætning og en håndfuld valuta- og nationaltegn. Mellemrum, linjeskift og almindelige engelske prosategn passer uden merpris.

Sammenkædning ændrer regnestykket. Flerdelte beskeder indsætter en User Data Header, så modtageren kan samle segmenterne i rækkefølge. En typisk 6-byte UDH bruger septet-plads og efterlader 153 tegn brugbar tekst pr. segment under GSM-7. Fakturering sker næsten altid pr. segment, ikke pr. logisk besked, så en 200-tegns GSM-7-brødtekst bliver to fakturerbare segmenter (153 plus resten). At forstå 160-mod-153-opdelingen er første skridt til at forudsige prisen, før du sender.

Udvidelsestabel: tegn der allerede koster to septetter

GSM 03.38 definerer også en udvidelsestabel, der nås via et dedikeret escape-septet. Tegn som firkantede parenteser [ ], krøllede parenteser { }, circumfleks ^, tilde ~, lodret streg |, omvendt skråstreg \ og eurotegnet indgår ikke i basissættet. Hvert af dem kodes som escape plus udvidelseskodepunktet, så hvert forbruger to af de 160 (eller 153) tilgængelige septetter. En besked, der ser kort ud på skærmen, kan derfor krydse en segmentgrænse tidligere, end et naivt tegnantal antyder.

Escape-mekanismen er stadig GSM-7; den skifter ikke beskeden til UCS-2. Den forskel er vigtig. Du kan medtage et par eurotegn eller parenteser og forblive i den effektive 7-bit-pakning. Først når encoderen møder et kodepunkt, der hverken findes i grundalfabetet eller udvidelsestabellen, forlader hele beskeden GSM-7. Indtil da tælles hvert tegn - også de dobbelt-kostende udvidelsestegn - stadig i septetter mod 160- eller 153-grænsen.

TegnklasseSeptetter forbrugt under GSM-7
Grundalfabet (A–Z, a–z, 0–9, almindelig tegnsætning)1
Udvidelsestabel ([ ] { } ^ ~ | \ og euro)2 (escape + kodepunkt)
Alt uden for GSM 03.38 (emoji, krøllede anførselstegn, de fleste ikke-latinske)Tvinger hele beskeden til UCS-2

UCS-2-fallback: ét tegn uden for alfabetet genindkoder alt

I det øjeblik et tegn ikke kan repræsenteres i GSM-7, skifter encoderen hele user data til 16-bit UCS-2 (reelt UTF-16-kodeenheder for BMP). Den samme 140-byte-payload rummer så kun 70 tegn. Med en sammenkædnings-UDH falder den brugbare længde til 67 tegn pr. segment. Der er intet delvist fallback: en enkelt emoji, et smart anførselstegn, en en-streg eller et tegn fra arabisk, kyrillisk, CJK eller de fleste andre skriftsystemer omskriver hele brødteksten. En 140-tegns engelsk sætning, der var ét GSM-7-segment, bliver tre UCS-2-segmenter, når et smileansigt tilføjes.

Det er mekanismen bag den uventede regning. Marketingsfolk skriver ofte tekst i en tekstbehandler, indsætter den i et SMS-værktøj og indfører uforvarende krøllede anførselstegn eller et hårdt mellemrum. Udviklere, der interpolerer brugergenererede navne eller produkttitler, kan indføre den samme usynlige trigger. Fordi genindkodningen er alt-eller-intet, hopper segmentantallet diskontinuerligt. Faktureringen ganges med det nye segmenttotal. Offentliggjorte all-in-tal som US $0,0125 pr. besked, med priser fra $0,004 i 149 lande, gør regnestykket konkret: hvert ekstra segment er en fuld opkrævning, ikke et brudstykke.

IndkodningGrænse for enkeltsegmentGrænse for sammenkædet segment
GSM-7 (7-bit)160 tegn153 tegn
UCS-2 (16-bit)70 tegn67 tegn

Usynlige fælder og skriftsystemer der tvinger UCS-2

Tekstbehandlere erstatter rutinemæssigt lige apostroffer og anførselstegn med krøllede typografiske former, laver dobbelte bindestreger om til tankestreger og indsætter hårde mellemrum. Ingen af disse kodepunkter hører til GSM 03.38. En besked, der på skærmen ligner en ren ASCII-version, kan derfor sendes som UCS-2 og koste flere segmenter. Det samme gælder indsat indhold fra websider eller designværktøjer, der foretrækker rigere Unicode. At tjekke de faktiske kodepunkter, ikke de renderede glyffer, er det eneste pålidelige værn.

Sprogvalg er lige så afgørende. Ren engelsk, basalt fransk, tysk, spansk og lignende latinske beskeder forforforbliver normalt i GSM-7, hvis accenterede bogstaver uden for standardalfabetet undgås eller translittereres. Græsk, kyrillisk, arabisk, hebraisk, devanagari, thai og CJK-familien har ingen GSM-7-kortlægning for almindelige bogstaver, så væsentlig brug af de skriftsystemer tvinger UCS-2 for hele beskeden. Selv et enkelt navn eller produktord i de skriftsystemer er nok. Emoji af enhver art ligger uden for GSM-7 pr. definition. Den praktiske regel er enkel: hvis tegnet ikke er i GSM 03.38 grund- eller udvidelsessæt, bliver hele payloaden 70/67.

Praktiske rettelser før du sender

Translitteration holder beskeder i GSM-7 på bekostning af ortografisk troskab. Erstatning af accenterede tegn med nærmeste ASCII-ækvivalenter, konvertering af krøllede anførselstegn til lige og kortlægning af tankestreger tilbage til bindestreger genskaber ofte 160/153-grænserne. For brandnavne eller juridisk tekst, der skal forblive præcis, accepter UCS-2 og budgetter med det højere segmentantal. Automatiske pre-flight-tjek, der scanner efter ikke-GSM-7-kodepunkter og rapporterer det resulterende segmenttotal under begge indkodninger, giver udviklere og marketingsfolk et klart prissignal, før beskeden sendes til SMSC.

Når du bygger skabeloner, hold variable felter under skærpet opsyn: et kundenavn i et andet skriftsystem eller en produkttitel med en emoji kan stille skifte en ellers GSM-7-skabelon. Rens eller normaliser udklipsholderindhold fra kilder med formateret tekst. Foretræk lige ASCII-tegnsætning i marketingtekst til SMS. Hvis du skal sende emoji eller ikke-latinsk tekst, design brødteksten, så UCS-2-segmentgrænserne falder ved naturlige frasebrud, og hold den samlede længde inden for så få 67-tegns bidder som muligt. Segmentbevidste længdetællere, der skifter visning mellem 160/153 og 70/67 efter det registrerede alfabet, fjerner det meste af overraskelsen. Priser varierer efter operatør og rute; de tidligere nævnte tal illustrerer pr.-segment-modellen snarere end en universel takst. Der er ærlig usikkerhed om præcis håndsætsrendering af kanttegn, så test på repræsentative enheder, når beskeden betyder noget.

Ofte stillede spørgsmål

Hvorfor bliver min SMS til flere beskeder, når jeg tilføjer én emoji?
Ethvert tegn uden for GSM 03.38-alfabetet, inkl. alle emojis, tvinger hele beskeden fra GSM-7 til UCS-2. Den 140-byte payload rummer så 70 tegn i stedet for 160 (67 i stedet for 153 ved sammenkædning). En tekst, der passede i ét GSM-7-segment, kan derfor blive til to eller tre UCS-2-segmenter, og der faktureres pr. segment.
Ændrer krøllede anførselstegn og tankestreger virkelig SMS-kodning?
Ja. Typografiske krøllede anførselstegn, tankestreger, en-streger og hårde mellemrum er ikke i GSM-7 basis- eller udvidelsessæt. Indsætter du dem fra en tekstbehandler, omkodes hele beskeden til UCS-2, så grænsen pr. segment falder fra 160/153 til 70/67, selvom teksten ser uændret ud på skærmen.
Hvor mange tegn passer i en sammenkædet SMS under GSM-7 versus UCS-2?
Under GSM-7 rummer et sammenkædet segment 153 tegn efter den typiske 6-byte UDH. Under UCS-2 efterlader samme header 67 tegn pr. segment. Enkeltsegment-grænser er 160 for GSM-7 og 70 for UCS-2. Segmentantal, ikke logisk beskedantal, driver prisen.

Relateret