Limity znaków i liczenie segmentów SMS
Każda wiadomość SMS jest przesyłana w jednostkach o stałym rozmiarze, zwanych segmentami. Każdy segment to jedna jednostka rozliczeniowa, więc długość wiadomości bezpośrednio wpływa na koszt. Liczba znaków mieszczących się w segmencie zależy od kodowania, które Bird wybiera dla treści wiadomości, a pojedynczy znak spoza domyślnego alfabetu może zmniejszyć pojemność o połowę.
Jak wybierane jest kodowanie
Bird sprawdza każdy znak w treści wiadomości przed wysłaniem:
- Jeśli każdy znak należy do alfabetu GSM-7 (standardowy 7-bitowy zestaw znaków zdefiniowany w GSM 03.38), wiadomość używa kodowania GSM-7.
- Jeśli choćby jeden znak wykracza poza GSM-7, cała wiadomość przełącza się na UCS-2 (16-bitowe kodowanie Unicode).
Bird nie miesza kodowań w ramach jednej wiadomości. Jedno emoji, znak CJK lub cudzysłów drukarki konwertuje całą treść na UCS-2.
Limity segmentów
| Kodowanie | Pojedynczy segment | Na segment (wieloczęściowy) |
|---|---|---|
| GSM-7 | 160 septetów | 153 septety |
| UCS-2 | 70 jednostek kodowych UTF-16 | 67 jednostek kodowych UTF-16 |
Gdy wiadomość jest dłuższa niż jeden segment, zostaje podzielona na wiele segmentów. Każdy segment wieloczęściowy rezerwuje kilka bajtów na nagłówek składania, zwany User Data Header. Zmniejsza to pojemność ze 160 do 153 dla GSM-7 i z 70 do 67 dla UCS-2.
Wiadomość GSM-7 zajmująca 161 septetów wymaga 2 segmentów (ceil(161 / 153) = 2). Podział rozkłada zakodowaną treść na oba segmenty, po 153 septety dostępne w każdym.
Maksymalna długość wiadomości
Bird akceptuje do 12 segmentów na wiadomość. Przekłada się to na:
- GSM-7: 1836 septetów (12 x 153)
- UCS-2: 804 jednostki kodowe UTF-16 (12 x 67)
Treść przekraczająca 12 segmentów jest odrzucana z błędem 422. Bird nigdy nie obcina wiadomości w ciszy.
Zestaw znaków GSM-7
GSM-7 obejmuje znaki potrzebne w większości wiadomości pisanych alfabetem łacińskim:
- Litery A-Z, a-z
- Cyfry 0-9
- Popularne znaki interpunkcyjne: @, £, $, !, ", #, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, spacja, nowa linia
- Niektóre znaki diakrytyczne z języków zachodnioeuropejskich, w tym é w café
Znaki z tablicy rozszerzeń
Kilka znaków należy do GSM-7, ale znajduje się w tablicy rozszerzeń. Każdy z nich kosztuje 2 septety zamiast 1, więc liczy się podwójnie względem limitu segmentu:
€, [, ], {, }, \, ~, ^, |
Ma to znaczenie na granicy limitu. Jeśli napiszesz 159 zwykłych znaków, a po nich jeden znak euro, zakodowany rozmiar wynosi 161 septetów (159 + 2), co przesuwa wiadomość do 2 segmentów, mimo że wygląda na 160 znaków.
Znaki wymuszające UCS-2
Każdy znak spoza GSM 03.38 wymusza przejście całej wiadomości na UCS-2. Najczęstsze przyczyny:
- Emoji: wiele emoji spoza Basic Multilingual Plane zajmuje dwie jednostki kodowe UTF-16. Ciąg 35 takich emoji mieści się w jednym segmencie; 36. przesuwa wiadomość do dwóch. Widoczne emoji może też łączyć kilka code pointów, więc licz zakodowaną treść, a nie widoczne symbole.
- Znaki CJK (chiński, japoński, koreański)
- Arabski, tajski, hindi i inne pisma spoza alfabetu GSM-7
- Cudzysłowy drukarskie (typograficzne): “ ” ‘ ’ (proste wersje " i ' należą do GSM-7). Inteligentne kodowanie może je podmienić przed wysłaniem.
Niektóre znaki łacińskie z diakrytykami, w tym é w café i ü, należą do zestawu GSM-7 i nie wymuszają UCS-2. Inne, w tym á, í i ú, wymuszają UCS-2.
Inteligentne kodowanie
Niektóre przyczyny przełączenia na UCS-2 nie wynikają z Twojego wyboru: edytor tekstu zamienia ' na ’, pauza trafia z wklejenia, pole formularza zawiera niełamliwą spację. Ustaw options.smart_encoding na true przy wysyłce, a Bird podmieni te znaki na ich odpowiedniki GSM-7 przed wysłaniem wiadomości, co utrzymuje treść w GSM-7 i może zmniejszyć liczbę segmentów o połowę.
Inteligentne kodowanie jest domyślnie wyłączone i działa tylko wtedy, gdy każdy pozostały znak mieści się w GSM-7. Jeśli po podmianie treść nadal zawiera znak spoza GSM-7, na przykład emoji lub nieobsługiwaną literę z diakrytyką, Bird wysyła ją dokładnie tak, jak została dostarczona. Inteligentne kodowanie opisuje tabelę podmian i sposób odczytu wyniku.
Odczytywanie liczby segmentów z API
Każda odpowiedź SMS zawiera obiekt segments, który raportuje, co Bird obliczył:
Przykład kodu
{
"segments": {
"count": 1,
"encoding": "GSM_7BIT",
"characters": 64
}
}- count: liczba segmentów podlegających rozliczeniu
- encoding: GSM_7BIT lub UCS2
- characters: liczba znaków (code pointów Unicode) w treści
count to liczba, za którą płacisz. Sprawdź ją w odpowiedzi lub w logu SMS, aby upewnić się, że wiadomości trafiają tam, gdzie oczekujesz.
Utrzymywanie wiadomości w jednym segmencie
Kilka nawyków, które zapobiegają przypadkowym wysyłkom wielosegmentowym:
- Zamieniaj cudzysłowy drukarskie na proste. Edytory tekstu i niektóre telefony automatycznie zamieniają " na “ ”, co wymusza UCS-2 i zmniejsza pojemność o połowę. Inteligentne kodowanie robi to za Ciebie przy wysyłkach, dla których je włączysz.
- Pomijaj emoji w wiadomościach transakcyjnych lub uwierzytelniających, gdzie liczy się liczba segmentów.
- Uważaj na znaki z tablicy rozszerzeń (€, {, }, [, ], \, ~, ^, |). Każdy z nich zajmuje dwa miejsca.
- Jeśli piszesz w piśmie niełacińskim (CJK, arabskim, tajskim), od początku planuj z uwzględnieniem limitów UCS-2: 70 znaków w jednym segmencie, 67 na segment przy podziale.
- Używaj rozpoznawalnych linków i sprawdzaj ich długość. Markowy skrócony link może zaoszczędzić miejsce; przed wyborem usługi skracania sprawdź wymagania dotyczące linków w danym kanale.
Następne kroki
Użyj kalkulatora segmentów SMS przed wysyłką i sprawdź wyrenderowane personalizacje w treści kampanii.
- Inteligentne kodowanie: przejrzyj każdą podmianę i włącz je dla poszczególnych wiadomości.
- Wysyłanie SMS: wyślij wiadomość i sprawdź liczbę jej segmentów.
- Log SMS: sprawdź kodowanie i segmenty podlegające rozliczeniu dla wysłanej wiadomości.
- Segmenty SMS: dlaczego jedno emoji podwaja koszt: film, w którym wysyłane są dwie wiadomości i porównywany jest koszt każdej z nich
Powiązane zasoby
Kontynuuj z dokumentacją, przewodnikami i przykładami dotyczącymi tego tematu. Zasoby są w języku angielskim.
Zrozum koncepcjęWhat is an SMS segment, and why did one message cost three?Poznaj możliwościSMS encodingPodążaj ścieżką naukiBuild your first integration
Wypróbuj ćwiczenie i uzyskaj brief wdrożeniowy