GSM-7 vs UCS-2: hvorfor én emoji dobler SMS-regningen din

Én emoji kan i det stille fordoble eller tredoble en SMS-regning. GSM 03.38 definerer to kodinger for 140-byte-nyttelasten: kompakt GSM-7 med 160 tegn, eller UCS-2 med 70. Ethvert tegn utenfor GSM-7-alfabetet tvinger hele meldingen over i UCS-2. Utviklere og markedsførere som limer inn tekst fra tekstbehandlere oppdager ofte dette først når fakturaene kommer.

GSM-7-pakking: 160 tegn i en 140-byte-nyttelast

SMS ble designet rundt en fast 140-byte brukerdata-nyttelast. GSM 03.38 definerer et 7-biters standardalfabet slik at disse 140 bytene kan romme 160 septetter: 140 ganger 8 delt på 7 er lik 160. Når en melding holder seg helt innenfor det alfabetet, behandler håndsettet og SMSC den som ett enkelt segment på opptil 160 tegn. Grunnsettet dekker store og små latinske bokstaver, sifre, vanlig tegnsetting og en håndfull valuta- og nasjonale symboler. Mellomrom, linjeskift og vanlige engelske prosatengn passer alle uten straff.

Sammenkobling endrer regnestykket. Flerdelte meldinger setter inn en User Data Header slik at mottakende enhet kan sette sammen segmentene i rekkefølge. En typisk 6-byte UDH bruker septett-plass og etterlater 153 tegn brukbar tekst per segment under GSM-7. Fakturering er nesten alltid per segment, ikke per logisk melding, så en 200-tegns GSM-7-kropp blir to fakturerbare segmenter (153 pluss resten). Å forstå skillet 160 versus 153 er første steg for å forutsi kostnad før du trykker send.

Utvidelsestabellen: tegn som allerede koster to septetter

GSM 03.38 definerer også en utvidelsestabell som nås med et dedikert escape-septett. Tegn som hakeparenteser [ ], krøllparenteser { }, cirkumfleks ^, tilde ~, vertikal strek |, bakstrek \ og eurosymbolet er ikke i grunnsettet. Hvert av dem kodes som escape pluss utvidelseskodepunktet, så hvert bruker to av de 160 (eller 153) tilgjengelige septettene. En melding som ser kort ut på skjermen kan derfor krysse en segmentgrense tidligere enn en naiv tegntelling skulle tilsi.

Escape-mekanismen er fortsatt GSM-7; den snur ikke meldingen over i UCS-2. Det skillet er viktig. Du kan inkludere noen euro eller klammer og forbli i den effektive 7-biters pakkingen. Først når enkoderen møter et kodepunkt som verken finnes i grunnalfabetet eller utvidelsestabellen, forlater hele meldingen GSM-7. Frem til det øyeblikket telles hvert tegn, inkludert de dobbeltkostende utvidelsestegnene, fortsatt i septetter mot 160- eller 153-grensen.

TegnklasseSeptetter brukt under GSM-7
Grunnalfabet (A-Z, a-z, 0-9, vanlig tegnsetting)1
Utvidelsestabell ([ ] { } ^ ~ | \ og euro)2 (escape + kodepunkt)
Alt utenfor GSM 03.38 (emoji, krøllete anførselstegn, de fleste ikke-latinske)Tvinger hele meldingen til UCS-2

UCS-2-fallback: ett tegn utenfor alfabetet omkoder alt

I det øyeblikket et tegn ikke kan representeres i GSM-7, bytter enkoderen hele brukerdataene til 16-biters UCS-2 (effektivt UTF-16-kodeenheter for BMP). Den samme 140-byte-nyttelasten rommer da bare 70 tegn. Med en sammenkoblings-UDH faller brukbar lengde til 67 tegn per segment. Det finnes ingen delvis fallback: én enkelt emoji, et smart anførselstegn, en tankestrek eller et tegn fra arabisk, kyrillisk, CJK eller de fleste andre skriftsystemer omskriver hele kroppen. En engelsk setning på 140 tegn som var ett GSM-7-segment blir tre UCS-2-segmenter når et smilefjes legges til.

Dette er mekanismen bak den overraskende regningen. Markedsførere utarbeider ofte tekst i en tekstbehandler, limer den inn i et SMS-verktøy og introduserer uvitende krøllete anførselstegn eller et hardt mellomrom. Utviklere som interpolerer brukergenererte navn eller produkttitler kan injisere den samme usynlige utløseren. Fordi omkodingen er alt-eller-ingenting, hopper segmentantallet diskontinuerlig. Faktureringen multipliseres med det nye segmenttotalet. Publiserte alt-inkluderende tall som US $0.0125 per melding, med priser fra $0.004 på tvers av 149 land, gjør regnestykket konkret: hvert ekstra segment er en ny full kostnad, ikke et brøkdelstillegg.

KodingGrense for enkeltsegmentGrense for sammenkoblet segment
GSM-7 (7-bit)160 tegn153 tegn
UCS-2 (16-bit)70 tegn67 tegn

Usynlige feller og skriftsystemer som tvinger UCS-2

Tekstbehandlere erstatter rutinemessig rette apostrofer og anførselstegn med krøllete typografiske former, gjør doble bindestreker om til tankestreker og setter inn harde mellomrom. Ingen av disse kodepunktene tilhører GSM 03.38. En melding som ser identisk ut med en ren ASCII-versjon på skjermen kan derfor reise som UCS-2 og koste flere segmenter. Det samme gjelder kopiert innhold fra nettsider eller designverktøy som favoriserer rikere Unicode. Å sjekke de faktiske kodepunktene, ikke de renderte glyfene, er det eneste pålitelige forsvaret.

Språkvalg er like avgjørende. Ren engelsk, grunnleggende fransk, tysk, spansk og lignende latinske skrifter forblir vanligvis i GSM-7 hvis aksentbokstaver som faller utenfor standardalfabetet unngås eller translittereres. Gresk, kyrillisk, arabisk, hebraisk, devanagari, thai og CJK-familien har ingen GSM-7-mapping for vanlige bokstaver, så enhver vesentlig bruk av disse skriftene tvinger UCS-2 for hele meldingen. Selv et enkelt navn eller produktord i de skriftene er nok. Emoji av alle slag ligger utenfor GSM-7 per definisjon. Den praktiske regelen er enkel: hvis tegnet ikke er i GSM 03.38 grunn- eller utvidelsessettet, blir hele nyttelasten 70/67.

Praktiske tiltak før du sender

Translitterering holder meldinger i GSM-7 på bekostning av ortografisk trofasthet. Å erstatte aksenttegn med nærmeste ASCII-ekvivalenter, konvertere krøllete anførselstegn til rette og mappe tankestreker tilbake til bindestreker gjenoppretter ofte 160/153-grensene. For merkenavn eller juridisk tekst som må forbli eksakt, aksepter UCS-2 og budsjetter for det høyere segmentantallet. Automatiserte forhåndskontroller som skanner etter ikke-GSM-7-kodepunkter og rapporterer resulterende segmenttotal under begge kodinger gir utviklere og markedsførere et klart kostnadssignal før meldingen sendes til SMSC.

Når du bygger maler, hold variable felt under oppsyn: et kundenavn i et annet skriftsystem eller en produkttittel med en emoji kan i det stille snu en ellers GSM-7-mal. Fjern eller normaliser utklippbuffere fra riktekstkilder. Foretrekk rett ASCII-tegnsetting i markedsføringstekst beregnet for SMS. Hvis du må sende emoji eller ikke-latinsk tekst, utform kroppen slik at UCS-2-segmentgrensene faller på naturlige frasebrudd og hold total lengde innenfor så få 67-tegns biter som mulig. Segmentbevisste lengdetellere som bytter visning mellom 160/153 og 70/67 etter deteksjon av alfabet fjerner det meste av overraskelsen. Priser varierer etter operatør og rute; de publiserte tallene nevnt tidligere illustrerer per-segment-modellen snarere enn en universell tariff. Ærlig usikkerhet gjenstår rundt eksakt håndsettrendering av kanttegn, så test på representative enheter når meldingen betyr noe.

Ofte stilte spørsmål

Hvorfor blir SMS-en min til flere meldinger av én emoji?
Ethvert tegn utenfor GSM 03.38-alfabetet, inkludert alle emojier, tvinger hele meldingen fra GSM-7 til UCS-2. Den 140-byte nyttelasten rommer da 70 tegn i stedet for 160 (67 i stedet for 153 ved sammenslåing). En tekst som passet i ett GSM-7-segment kan derfor bli to eller tre UCS-2-segmenter, og fakturering skjer per segment.
Endrer krøllede anførselstegn og tankestreker virkelig SMS-kodingen?
Ja. Typografiske krøllede anførselstegn, tankestreker, korte tankestreker og hardt mellomrom er ikke i GSM-7 grunn- eller utvidelsessett. Innliming fra tekstbehandler koder hele meldingen om til UCS-2 og senker grensen per segment fra 160/153 til 70/67 selv når teksten ser uendret ut på skjermen.
Hvor mange tegn får plass i en sammenslått SMS under GSM-7 kontra UCS-2?
Under GSM-7 rommer et sammenslått segment 153 tegn etter typisk 6-byte UDH. Under UCS-2 etterlater samme header 67 tegn per segment. Enkeltsegmentgrenser er 160 for GSM-7 og 70 for UCS-2. Segmentantall, ikke logisk meldingsantall, styrer kostnaden.

Relatert