Sign inGet started

Tekenlimieten en segmenttelling voor SMS

Elk SMS-bericht wordt verzonden in eenheden van vaste grootte, segmenten genaamd. Elk segment is één factuureenheid, dus de lengte van het bericht bepaalt direct de kosten. Hoeveel tekens in een segment passen, hangt af van de codering die Bird voor je berichttekst kiest, en één enkel teken buiten het standaardalfabet kan de capaciteit halveren.

Hoe de codering wordt gekozen

Bird inspecteert elk teken in je berichttekst voordat het wordt verzonden:
  • Als elk teken tot het GSM-7-alfabet behoort (de standaard 7-bit tekenset gedefinieerd door GSM 03.38), gebruikt het bericht GSM-7-codering.
  • Als één enkel teken buiten GSM-7 valt, schakelt het hele bericht over naar UCS-2 (16-bit Unicode-codering).
Bird mixt geen coderingen binnen één bericht. Eén emoji, CJK-teken of typografisch aanhalingsteken converteert de hele berichttekst naar UCS-2.

Segmentlimieten

CoderingEén segmentPer segment (multipart)
GSM-7160 septets153 septets
UCS-270 UTF-16 code units67 UTF-16 code units
Wanneer een bericht langer is dan één segment, wordt het opgesplitst in meerdere segmenten. Elk multipart-segment reserveert enkele bytes voor een samenstellingsheader, de User Data Header genaamd. Dit verlaagt de capaciteit van 160 naar 153 voor GSM-7, en van 70 naar 67 voor UCS-2.
Een GSM-7-bericht van 161 septets kost 2 segmenten (ceil(161 / 153) = 2). De opsplitsing verdeelt de gecodeerde berichttekst over beide segmenten, met 153 septets beschikbaar in elk segment.

Maximale berichtlengte

Bird accepteert maximaal 12 segmenten per bericht. Dat vertaalt zich naar:
  • GSM-7: 1.836 septets (12 × 153)
  • UCS-2: 804 UTF-16 code units (12 × 67)
Een berichttekst die meer dan 12 segmenten beslaat, wordt geweigerd met een 422-fout. Bird kapt een bericht nooit stilzwijgend af.

De GSM-7-tekenset

GSM-7 bevat de tekens die de meeste berichten in Latijns schrift nodig hebben:
  • Letters A-Z, a-z
  • Cijfers 0-9
  • Veelgebruikte leestekens: @, £, $, !, ", #, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, spatie, nieuwe regel
  • Enkele tekens met accenten uit West-Europese talen, waaronder é in café

Extensietabeltekens

Een aantal tekens hoort bij GSM-7 maar staat op een extensietabel. Elk daarvan kost 2 septets in plaats van 1, dus ze tellen dubbel mee voor de segmentlimiet:
, [, ], {, }, \, ~, ^, |
Dit is belangrijk bij de grens. Als je 159 gewone tekens schrijft gevolgd door één euroteken, is de gecodeerde grootte 161 septets (159 + 2), waardoor het bericht in 2 segmenten terechtkomt, ook al lijken het 160 tekens.

Tekens die UCS-2 activeren

Elk teken buiten GSM 03.38 dwingt het hele bericht naar UCS-2. De meest voorkomende oorzaken:
  • Emoji: veel emoji buiten het Basic Multilingual Plane gebruiken twee UTF-16 code units. Een reeks van 35 zulke emoji past in één segment; de 36e duwt het naar twee. Een zichtbare emoji kan ook meerdere code points combineren, dus tel de gecodeerde berichttekst in plaats van de zichtbare symbolen.
  • CJK-tekens (Chinees, Japans, Koreaans)
  • Arabisch, Thai, Hindi en andere schriften buiten het GSM-7-alfabet
  • Typografische aanhalingstekens: (de rechte versies " en ' zijn GSM-7). Slimme codering kan deze vóór verzending vervangen.
Sommige Latijnse tekens met accenten, waaronder é in café en ü, horen bij de GSM-7-set en activeren UCS-2 niet. Andere, waaronder á, í en ú, activeren UCS-2 wel.

Slimme codering

Sommige UCS-2-oorzaken zijn niet tekens die je zelf hebt gekozen: een tekstverwerker verandert ' in , een em-dash komt mee bij het plakken, een formulierveld bevat een vaste spatie. Stel options.smart_encoding in op true bij een verzending en Bird vervangt die door hun GSM-7-equivalenten voordat het bericht wordt verstuurd, zodat de berichttekst in GSM-7 blijft en het aantal segmenten kan halveren.
Slimme codering staat standaard uit en geldt alleen wanneer elk resterend teken GSM-7 kan gebruiken. Als de berichttekst na vervanging nog een teken buiten GSM-7 bevat, zoals een emoji of een niet-ondersteund teken met accent, verstuurt Bird het precies zoals aangeleverd. Slimme codering behandelt de vervangingstabel en hoe je het resultaat leest.

Segmentaantallen aflezen uit de API

Elk SMS-antwoord bevat een segments-object dat rapporteert wat Bird heeft berekend:
Codevoorbeeld
{
  "segments": {
    "count": 1,
    "encoding": "GSM_7BIT",
    "characters": 64
  }
}
  • count: het aantal factureerbare segmenten
  • encoding: GSM_7BIT of UCS2
  • characters: het aantal tekens (Unicode code points) in de berichttekst
De waarde van count bepaalt hoeveel segmenten worden gefactureerd. Controleer deze in het antwoord of in het SMS-log om te zien of het aantal segmenten overeenkomt met je verwachting.

Berichten beperken tot één segment

Een paar gewoontes die onbedoelde multisegmentverzendingen voorkomen:
  • Vervang typografische aanhalingstekens door rechte aanhalingstekens. Tekstverwerkers en sommige telefoons vervangen " automatisch door , wat UCS-2 afdwingt en je capaciteit halveert. Slimme codering doet dit voor je bij de verzendingen waarvoor je het inschakelt.
  • Vermijd emoji in transactionele of authenticatieberichten waar het aantal segmenten ertoe doet.
  • Let op extensietabeltekens (, {, }, [, ], \, ~, ^, |). Elk daarvan neemt twee tekenposities in.
  • Als je in een niet-Latijns schrift schrijft (CJK, Arabisch, Thai), houd dan vanaf het begin rekening met de UCS-2-limieten: 70 tekens per enkel segment, 67 per segment bij opsplitsing.
  • Gebruik herkenbare links en controleer hun lengte. Een verkorte merklink kan ruimte besparen; controleer de linkvereisten van de bestemming voordat je een verkortingsservice kiest.

Vervolgstappen

Gebruik de SMS-segmentcalculator vóór een verzending en controleer gerenderde personalisaties in je campagne-inhoud.