Blog

SMS character limit: why one emoji can double your text

GSM-7, UCS-2 and segments, explained with an emoji, a curly apostrophe and a line of Amharic, plus what 153 and 67 really mean.

Sparetext

5 min read Β· Oct 31, 2026

Here's a text of exactly 100 characters. It goes out as one SMS. Add a space and a πŸŽ‰ to the end, and it goes out as two.

text
Hi Dana, your order 1042 is packed and leaves the shop at 3pm today. Reply here if anything changed.
β†’ 1 SMS (GSM-7)

Hi Dana, your order 1042 is packed and leaves the shop at 3pm today. Reply here if anything changed. πŸŽ‰
β†’ 2 SMS (UCS-2)

Nothing about the words changed. One party popper made the phone switch alphabets, and the new one holds less than half as much. If you send a lot of texts, or pay per part, that's worth five minutes of your time.

One SMS is 140 bytes

Under the hood, an SMS carries 140 bytes of text. That's the whole budget, and the alphabet decides how many characters fit in it.

GSM-7 is the standard SMS alphabet, defined in GSM 03.38. It spends 7 bits on each character, a septet, so 140 bytes hold 160 of them. It has the Latin letters, digits, everyday punctuation, a few accented letters like Γ©, Γ± and ΓΌ, and even some Greek capitals like Ξ” and Ξ©.

A few GSM-7 symbols cost two: ^ { } \ [ ~ ] | and €. They travel as an escape plus the character, so "€20" takes the room of 4 characters, not 3.

UCS-2 is the fallback for everything else. It spends 16 bits on each character, so the same 140 bytes hold just 70.

One character outside GSM-7, and the whole text goes UCS-2.

That's the part that surprises people. It isn't just the odd character that gets the expensive treatment. The whole text switches.

Emoji count double

Emoji aren't in GSM-7, so any emoji makes a text UCS-2. Most of them also live beyond the Basic Multilingual Plane, the first 65,536 characters of Unicode, which is as far as a 16-bit slot reaches. So they travel as a surrogate pair: two slots for one emoji.

A wave πŸ‘‹ or a party popper πŸŽ‰ costs 2. A thumbs up with a skin tone, πŸ‘πŸ½, costs 4, because the skin tone is a second character. Ethiopia's flag πŸ‡ͺπŸ‡Ή costs 4 too: it's two letter symbols, E and T, that your phone draws as a flag.

So that little flag next to your shop's name takes the room of four letters, and it drops the whole text from 160 characters to 70.

The curly apostrophe trap

Emoji, at least, you add on purpose. The sneaky one is punctuation you never chose. Phones and word processors like to swap a straight ' for a curly ’, and straight quotes for β€œ and ”, and those look-alikes aren't in GSM-7 either.

text
Hi Dana, your code is 481920. It works for 10 minutes. Don't share it with anyone.
β†’ 1 SMS (GSM-7, 82 characters)

Hi Dana, your code is 481920. It works for 10 minutes. Don’t share it with anyone.
β†’ 2 SMS (UCS-2, 82 characters)

Same 82 characters, one different apostrophe, twice the parts. Long dashes and the one-character ellipsis do the same thing.

Sparetext can fix this for you. Turn on Swap look-alike characters in Settings β€Ί Sending, and curly quotes, long dashes and ellipses become plain ones whenever that keeps a text in GSM-7. A text with emoji or another alphabet stays exactly as you wrote it, since swapping a quote wouldn't save anything there.

On the API, smartEncoding turns the swap on or off for a single send, and the compose box in the dashboard offers it as you type.

Amharic is UCS-2 from the first letter

Here in Addis Ababa, this isn't an edge case. Amharic is written in the Ethiopic script, the fidel, and none of it is in GSM-7. So every Amharic text is UCS-2 from its first letter, with 70 characters to an SMS.

The good news is that each fidel character takes one slot, not two, because the script sits inside those first 65,536 characters. Amharic never pays the emoji tax.

text
αˆ°αˆ‹αˆ! α‰΅α‹•α‹›α‹α‹Ž α‰°αˆαŠ³αˆα’
(Hello! Your order has been sent.)
β†’ 1 SMS (UCS-2, 16 characters, 16 units)

Hi Sam, αˆ°αˆ‹αˆ πŸ‘‹
β†’ 1 SMS (UCS-2, 13 characters, 14 units: the wave counts 2)

Watch out for mixing, though. An English reminder stays GSM-7 until one customer's name is written in fidel. A Selam saved as αˆ°αˆ‹αˆ turns her whole reminder into UCS-2. So when your list mixes scripts, count the worst case: your longest name, written in fidel.

What 153 and 67 mean

A text longer than one SMS goes out as a concatenated SMS: several parts, or segments, that the phone at the other end glues back into one message. To do that, each part carries a small header, the UDH, saying which message it belongs to and where it goes in line.

That header takes 6 of the 140 bytes. What's left holds 153 GSM-7 characters, or 67 in UCS-2, which is where those odd numbers come from.

text
          1 part      2 parts       3 parts
GSM-7     up to 160   161 to 306    307 to 459
UCS-2     up to 70    71 to 134     135 to 201

Notice the cliff. At 160 GSM-7 characters you're in one part; at 161 you're in two, and each holds only 153. It's also how one emoji can triple a text: a 156-character reminder plus a space and a πŸŽ‰ is 159 units of UCS-2, and that needs three parts of 67.

One small rule on top: a part can't split an emoji or a two-slot GSM-7 symbol down the middle, so once in a while a text takes one part more than plain division says.

What it costs you

Carriers and SMS APIs bill each part. On an unlimited plan you may never notice. On a bundle, or with an API that charges per part, a stray emoji on a big send can double the bill.

On Sparetext, a text counts once against your plan however many parts it takes. The compose box even says so: "arrives as 1 message, sent in 3 parts (counts as 1 text)". Your carrier is the one counting parts.

Parts cost time, too. Android lets an app hand the radio about 30 parts a minute, and Sparetext paces under that, so a send of three-part texts takes about three times as long as the same send in one part.

AI agents see all this as well. When Claude or ChatGPT sends through Sparetext, the send_sms tool reports the encoding and the number of parts, so the assistant knows what each text really cost.

Check a text before you send it

You don't have to count by hand. Paste a text into the free SMS segment calculator and it shows the parts, the encoding, and exactly which characters pushed it into UCS-2, with a button to fix curly quotes and dashes. Templates are counted with the blanks filled in, so you can try your longest customer name. It runs in your browser, and nothing you paste goes anywhere.

Start with the text you send most, the reminder or the code or the "your order is ready", and see if it fits in one part. If it doesn't, at least now you know which character to blame.

sms basicsgsm-7ucs-2emojiamharic

Try it with the phone you have

Free for 1 phone and 300 texts a month. Pair it in about two minutes.

Start free

Responses

Sign in or create an account to respond.

More from the blog