Sign inGet started

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

KodowaniePojedynczy segmentNa segment (wieloczęściowy)
GSM-7160 septetów153 septety
UCS-270 jednostek kodowych UTF-1667 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.