GSM-7 vs UCS-2: dlaczego jedna emoji podwaja rachunek za SMS

Jedna emoji może po cichu podwoić lub potroić rachunek za SMS. GSM 03.38 definiuje dwa kodowania 140-bajtowego ładunku: zwarte GSM-7 na 160 znaków lub UCS-2 na 70. Dowolny znak spoza alfabetu GSM-7 wymusza UCS-2 dla całej wiadomości. Developerzy i marketerzy wklejający treść z procesorów tekstu często odkrywają to dopiero przy fakturze.

Pakowanie GSM-7: 160 znaków w 140-bajtowym ładunku

SMS zaprojektowano wokół stałego 140-bajtowego ładunku danych użytkownika. GSM 03.38 definiuje 7-bitowy alfabet domyślny, dzięki czemu te 140 bajtów mieści 160 septetów: 140 razy 8 podzielone przez 7 równa się 160. Gdy wiadomość mieści się w całości w tym alfabecie, telefon i SMSC traktują ją jako jeden segment do 160 znaków. Zestaw podstawowy obejmuje wielkie i małe litery łacińskie, cyfry, typową interpunkcję oraz kilka symboli walut i narodowych. Spacje, nowe linie i zwykłe znaki angielskiej prozy mieszczą się bez kary.

Konkatenacja zmienia rachunek. Wiadomości wieloczęściowe wstawiają User Data Header, by urządzenie odbiorcze złożyło segmenty w kolejności. Typowy 6-bajtowy UDH zużywa miejsce septetów, zostawiając 153 znaki użytecznego tekstu na segment w GSM-7. Rozliczenie prawie zawsze jest za segment, nie za logiczną wiadomość, więc treść GSM-7 o 200 znakach to dwa płatne segmenty (153 plus reszta). Zrozumienie podziału 160 kontra 153 to pierwszy krok do przewidzenia kosztu przed wysłaniem.

Tabela rozszerzeń: znaki, które już kosztują dwa septety

GSM 03.38 definiuje również tabelę rozszerzeń osiąganą przez dedykowany septet ucieczki. Znaki takie jak nawiasy kwadratowe [ ], nawiasy klamrowe { }, daszek ^, tylda ~, kreska pionowa |, ukośnik wsteczny \ oraz znak euro nie należą do zestawu podstawowego. Każdy z nich jest kodowany jako znak ucieczki plus punkt kodowy rozszerzenia, więc każdy zużywa dwa z 160 (lub 153) dostępnych septetów. Wiadomość, która na ekranie wygląda na krótką, może więc przekroczyć granicę segmentu wcześniej, niż sugeruje naiwne zliczanie znaków.

Mechanizm ucieczki pozostaje w GSM-7; nie przełącza wiadomości na UCS-2. Ta różnica ma znaczenie. Możesz dodać kilka euro lub nawiasów i zostać przy efektywnym pakowaniu 7-bitowym. Dopiero gdy enkoder natrafi na codepoint spoza alfabetu podstawowego i tabeli rozszerzeń, cała wiadomość opuszcza GSM-7. Do tego momentu każdy znak, w tym dwukosztowe znaki rozszerzeń, liczy się w septetach względem limitu 160 lub 153.

Klasa znakówZużyte septety w GSM-7
Alfabet podstawowy (A–Z, a–z, 0–9, typowa interpunkcja)1
Extension table ([ ] { } ^ ~ | \ and euro)2 (escape + kod)
Wszystko spoza GSM 03.38 (emoji, cudzysłowy typograficzne, większość niełacińskich)Wymusza UCS-2 dla całej wiadomości

Fallback UCS-2: jeden znak spoza alfabetu przekodowuje wszystko

Gdy jakikolwiek znak nie da się zapisać w GSM-7, enkoder przełącza całe dane użytkownika na 16-bitowe UCS-2 (faktycznie jednostki kodowe UTF-16 dla BMP). Ten sam 140-bajtowy ładunek mieści wtedy tylko 70 znaków. Z UDH konkatenacji użyteczna długość spada do 67 znaków na segment. Nie ma częściowego fallbacku: jedna emoji, inteligentny cudzysłów, półpauza lub znak z arabskiego, cyrylicy, CJK czy większości innych skryptów przepisuje całą treść. Angielskie zdanie o 140 znakach, które było jednym segmentem GSM-7, staje się trzema segmentami UCS-2 po dodaniu uśmiechniętej buźki.

To mechanizm zaskakującego rachunku. Marketerzy często piszą treść w procesorze tekstu, wklejają do narzędzia SMS i nieświadomie wprowadzają cudzysłowy typograficzne lub spację niełamliwą. Developerzy interpolujący nazwy użytkowników lub tytuły produktów mogą wstrzyknąć ten sam niewidoczny wyzwalacz. Ponieważ przekodowanie jest zero-jedynkowe, liczba segmentów skacze nieciągle. Rozliczenie mnoży się przez nową sumę segmentów. Publikowane stawki obejmujące wszystko, np. US $0.0125 za segment, z cenami od $0.004 w 149 krajach, czynią rachunek konkretnym: każdy dodatkowy segment to pełna opłata, nie ułamek.

KodowanieLimit pojedynczego segmentuLimit segmentu w konkatenacji
GSM-7 (7-bit)160 znaków153 znaki
UCS-2 (16-bit)70 znaków67 znaków

Niewidoczne pułapki i skrypty wymuszające UCS-2

Procesory tekstu rutynowo zamieniają proste apostrofy i cudzysłowy na formy typograficzne, podwójne łączniki na pauzy i wstawiają spacje niełamliwe. Żaden z tych codepointów nie należy do GSM 03.38. Wiadomość wyglądająca na ekranie identycznie jak wersja plain-ASCII może więc iść jako UCS-2 i kosztować wiele segmentów. To samo dotyczy treści wklejonych ze stron www lub narzędzi projektowych faworyzujących bogatszy Unicode. Sprawdzanie rzeczywistych codepointów, nie wyrenderowanych glifów, to jedyna pewna obrona.

Wybór języka jest równie decydujący. Czysty angielski, podstawowy francuski, niemiecki, hiszpański i podobne wiadomości w alfabecie łacińskim zwykle zostają w GSM-7, jeśli unika się lub transliteruje litery akcentowane spoza alfabetu domyślnego. Greka, cyrylica, arabski, hebrajski, dewanagari, tajski i rodzina CJK nie mają mapowania GSM-7 dla zwykłych liter, więc istotne użycie tych skryptów wymusza UCS-2 dla całej wiadomości. Wystarczy nawet pojedyncza nazwa lub słowo produktu. Emoji każdego rodzaju leżą poza GSM-7 z definicji. Praktyczna reguła jest prosta: jeśli znak nie jest w zestawie podstawowym lub tabeli rozszerzeń GSM 03.38, cały ładunek staje się 70/67.

Praktyczne poprawki przed wysłaniem

Transliteracja trzyma wiadomości w GSM-7 kosztem wierności ortograficznej. Zamiana znaków akcentowanych na najbliższe odpowiedniki ASCII, cudzysłowów typograficznych na proste i pauz z powrotem na łączniki często przywraca limity 160/153. Przy nazwach marek lub tekście prawnym, który musi pozostać dokładny, zaakceptuj UCS-2 i zaplanuj wyższą liczbę segmentów. Automatyczne kontrole wstępne skanujące punkty kodowe spoza GSM-7 i raportujące wynikową liczbę segmentów w obu kodowaniach dają developerom i marketerom jasny sygnał kosztu przed oddaniem wiadomości do SMSC.

Przy budowie szablonów pilnuj pól zmiennych: imię klienta w innym skrypcie lub tytuł produktu z emoji może po cichu przełączyć szablon, który inaczej pozostałby w GSM-7. Czyść lub normalizuj bufory wklejania ze źródeł tekstu sformatowanego. Preferuj prostą interpunkcję ASCII w treściach marketingowych na SMS. Jeśli musisz wysłać emoji lub tekst niełaciński, projektuj treść tak, by granice segmentów UCS-2 wypadały na naturalnych przerwach fraz i trzymaj łączną długość w jak najmniejszej liczbie kawałków po 67 znaków. Liczniki długości świadome segmentów, przełączające wyświetlanie między 160/153 a 70/67 według wykrytego alfabetu, usuwają większość niespodzianek. Stawki różnią się w zależności od operatora i trasy; cytowane wcześniej publikowane wartości ilustrują model za segment, a nie uniwersalną taryfę. Pozostaje niepewność co do dokładnego renderowania skrajnych znaków na telefonach, więc testuj na reprezentatywnych urządzeniach, gdy wiadomość ma znaczenie.

Często zadawane pytania

Dlaczego dodanie jednej emoji zamienia SMS w kilka wiadomości?
Każdy znak spoza alfabetu GSM 03.38, w tym każda emoji, wymusza przejście całej wiadomości z GSM-7 na UCS-2. Ładunek 140 bajtów mieści wtedy 70 znaków zamiast 160 (67 zamiast 153 przy konkatenacji). Treść mieszcząca się w jednym segmencie GSM-7 może więc stać się dwoma lub trzema segmentami UCS-2, a rozliczenie jest za segment.
Czy typograficzne cudzysłowy i myślniki naprawdę zmieniają kodowanie SMS?
Tak. Typograficzne cudzysłowy, myślniki, półpauzy i spacje niełamliwe nie wchodzą w podstawowy ani rozszerzony zestaw GSM-7. Wklejenie ich z edytora tekstu przełącza całą wiadomość na UCS-2, obniżając limit na segment z 160/153 do 70/67 nawet gdy tekst wygląda na ekranie tak samo.
Ile znaków mieści się w konkatenowanym SMS w GSM-7, a ile w UCS-2?
W GSM-7 konkatenowany segment mieści 153 znaki po typowym 6-bajtowym UDH. W UCS-2 ten sam nagłówek zostawia 67 znaków na segment. Limity pojedynczego segmentu: 160 dla GSM-7 i 70 dla UCS-2. Koszt zależy od liczby segmentów, nie od logicznej liczby wiadomości.

Powiązane