Message limits
SMS character and segment counter
Count SMS characters and billable segments live, see when one emoji or curly quote flips the message to UCS-2, and which characters did it.
Instructions
How to use this tool
- 01Type or paste your message. The count updates as you type, and nothing you write leaves the page.
- 02Read the encoding first: GSM-7 gives you 160 characters per message, UCS-2 gives you 70. One character outside the GSM alphabet flips the whole message.
- 03If the message went UCS-2, check the culprit list. A curly quote pasted from a doc is the usual cause, and swapping it back more than doubles the budget.
- 04Watch the segment count, since carriers bill per segment. A 161-character GSM message costs two segments, not one.
Background
How SMS counting actually works
Every SMS is encoded either as GSM-7 or as UCS-2, and the choice is all or nothing. If every character fits the GSM 03.38 alphabet, the message carries 160 characters in one segment, or 153 per segment once it splits, because each part of a concatenated message spends 6 bytes on a reassembly header. If even one character falls outside that alphabet, the entire message is encoded as UCS-2 and the budget drops to 70 characters, 67 per segment when split.
Nine characters sit in a GSM extension table and cost two septets each: the caret, curly braces, square brackets, backslash, tilde, pipe, and the euro sign. A message full of JSON or price strings burns budget twice as fast as its visible length suggests.
Background
Double-byte languages, emoji, and what a character costs
Chinese, Japanese, Korean, Arabic, Hindi, Thai, Hebrew, Cyrillic, and lowercase Greek all live outside the GSM alphabet, so any message in those scripts is UCS-2 from the first character: 70 per message, 67 per segment. That is not a defect in your provider, it is how the standard allocates its 140 bytes, and copy written for those markets should be planned around the shorter budget from the start.
UCS-2 counts UTF-16 code units rather than visible characters. Everything in the Basic Multilingual Plane, which covers almost all CJK in everyday use, costs one unit. Almost every emoji sits outside it and costs two. Composed emoji cost far more: a family emoji built from several code points joined by zero-width joiners can spend eight or more units on one visible glyph. The counter shows visible characters and billable units side by side so the gap is never a surprise.
FAQ
Frequently asked questions
Why did my 100-character message bill as two segments?
Something in it forced UCS-2 encoding, which caps a single message at 70 characters. One emoji, one curly quote, or one character from a non-Latin script is enough, and the whole message pays the price, not just that character. The culprit list in this tool shows exactly which characters did it.
How many characters fit in one SMS?
160 if every character is in the GSM-7 alphabet, 70 if anything outside it forces UCS-2. Once a message splits, each segment carries 153 or 67 because 6 bytes go to the header that lets the phone reassemble the parts.
How much does an emoji cost in an SMS?
It forces the whole message to UCS-2, cutting the budget from 160 to 70, and the emoji itself usually costs 2 of those 70 because it sits outside the Basic Multilingual Plane. Composed emoji like families or skin-tone variants cost more, sometimes 8 or more units for one visible glyph.
Do Chinese, Japanese, Arabic, or Korean messages always get 70 characters?
Yes. Those scripts are not in the GSM-7 alphabet, so messages in them are UCS-2: 70 characters in one message, 67 per segment when longer. Most everyday CJK characters cost one unit each; rare characters outside the BMP cost two.
Which GSM characters count double?
The nine extension characters: ^ { } \ [ ] ~ | and the euro sign. Each is sent as an escape plus the character, so each costs two septets while the message as a whole stays GSM-7.
More tools
Browse more free tools
Stop paying for segments you did not plan
Courier sends SMS through your provider with the same template tools as email and push, so the copy that fits one channel can be trimmed for another.
Start sending free