Four numbers that decide what you pay. Here is where each one comes from, and which characters quietly move you from the first pair to the second.
| Situation | Characters you get | You can type on HantarSMS |
|---|---|---|
| Plain English, fits in one SMS | 160 | 156 |
| Plain English, message is split across several | 153 per part | 302 in 2 parts, 455 in 3 |
| Contains any non-GSM character, one SMS | 70 | 66 |
| Contains any non-GSM character, split | 67 per part | 130 in 2 parts, 197 in 3 |
The last column is lower because our upstream route adds a 4-character prefix to every message (explained below).
An SMS payload is 140 bytes — a limit set when the standard was designed in the 1980s around spare capacity in the signalling channel. The GSM-7 alphabet packs each character into 7 bits rather than 8, so 140 bytes × 8 ÷ 7 = 160 characters. The number is not a policy anyone chose; it falls out of the arithmetic.
A longer message is not sent as independent SMS. It is split into parts, and each part carries a 6-byte header (a UDH) telling the handset which message this belongs to and what order to reassemble in. That header eats 7 characters of GSM-7 space, leaving 153.
This produces the counter-intuitive boundary that costs people money. Lengths below are what you type on HantarSMS; the 4-character prefix our upstream route adds is counted on top:
| Length | Segments | Why |
|---|---|---|
| 156 | 1 | 160 with the prefix — fits without a header |
| 157 | 2 | 161 with the prefix: needs splitting, so both parts drop to 153 |
| 302 | 2 | 306 with the prefix = 153 × 2 |
| 303 | 3 | 307 with the prefix; 153 × 3 = 459 available |
One character past 156 doubles the bill. Cutting a 157-character message by one character is the cheapest saving available in SMS.
GSM-7 has a fixed alphabet of about 128 characters. Anything outside it forces the entire message to UCS-2 (Unicode), where each character takes 16 bits instead of 7. 140 bytes ÷ 2 = 70 characters, and 67 once split.
This applies to the whole message, not the one character. A 150-character English promo is one segment. Add one emoji and it is 151 characters of Unicode — 155 with the 4-character prefix — which at 67 per part is three segments. One character, triple the cost.
Emoji are obvious. These are the ones that catch people, and they usually arrive by pasting from a word processor or a design tool:
| Looks like | Actually is | Type this instead |
|---|---|---|
| ’ curly apostrophe | U+2019, not GSM | ' straight apostrophe |
| “ ” curly quotes | U+201C/201D | " straight quotes |
| – en dash, — em dash | U+2013 / U+2014 | - hyphen |
| … ellipsis character | U+2026 | ... three dots |
| Non-breaking space | U+00A0 | Normal space |
| Any Chinese, Tamil or Jawi text | Unicode by definition | No workaround — budget 66 |
Word processors substitute the first four automatically as you type. If a message looks like plain English but your platform reports Unicode, one of these is why.
In the GSM standard, [ ] { } \ ~ ^ | are stored as two characters via an escape
sequence, and many calculators count them double. On our route they count as one
character each and do not force Unicode (we verified this against the upstream billing
record: a 156-character message ending in [ was billed as one segment). Accented
letters and the euro sign are different: é £ € are not plain English characters, so
any one of them switches the whole message to Unicode.
Our upstream route adds a 4-character prefix to every message, and those characters come out of your 160, not the operator's: one segment holds 156 plain-English characters, or 66 if the message uses Unicode. A message you measured at exactly 160 characters in a text editor bills as 2 segments.
Generic online SMS counters do not know about this, which makes them wrong at exactly the boundary where being wrong is expensive. Our segment calculator counts the prefix, so the number it shows is the number you are billed.
What this means for a campaign budget is worked through in bulk SMS cost in Malaysia.
160 characters for a single message in plain English (GSM-7 encoding). If the message is longer it is split, and each part then holds 153 because a reassembly header consumes the rest. With any non-GSM character the limit is 70, or 67 per part when split. On HantarSMS our upstream route adds a 4-character prefix to every message, so one segment holds 156 plain-English characters, or 66 in Unicode.
The message contains at least one character outside the GSM-7 alphabet, which forces the whole message to Unicode where each character takes 16 bits instead of 7. Usually an emoji, Chinese text, or a curly apostrophe pasted from a word processor.
It can. A 150-character English message is one segment. Adding one emoji makes it 151 Unicode characters — 155 with the 4-character prefix our upstream adds — which at 67 per part is three segments. The emoji does not cost extra by itself — it re-prices every other character in the message.
306 in plain English (153 × 2), or 134 in Unicode (67 × 2). Note it is not 320: once a message is split, every part loses 7 characters to the reassembly header, including the first. On HantarSMS the 4-character prefix our upstream adds comes out of that, so two segments hold 302 plain-English or 130 Unicode characters that you type.
Yes, both count as characters. A line break is one character in GSM-7. Trailing spaces at the end of a message count too, and are a common reason a message that looks like exactly 156 characters bills as two segments.
The calculator shows encoding, segments and cost live, including the operator prefix.