No emoji is part of the GSM 7-bit alphabet, so a message that contains one is sent entirely as Unicode (UCS-2). That lowers the limit for a single SMS from 160 units to 70, and for each part of a longer message from 153 to 67. The emoji then uses units of its own: 2 for most emoji, and more for combined ones. A 100-character text that fitted easily in one message becomes two parts the moment an emoji is added.

You can watch this happen in the SMS Character Counter: type a message, add an emoji, and the encoding, unit count and number of parts all change at once.

Two costs, not one

The switch. An SMS uses one encoding for the whole message. GSM-7 packs each character into 7 bits; UCS-2 gives each one 16. Because the message still has only 140 octets to work with, the same space that held 160 seven-bit characters holds 70 sixteen-bit units. The emoji is the cause, but every letter, digit and space in the message pays for it. The general rules are in the guide to SMS character limits.

The emoji's own size. A 16-bit unit can hold 65,536 different values, and most emoji have code points above that range. Each of those is written as two units, called a surrogate pair. The Unicode Consortium's FAQ points out that strict UCS-2 "cannot be used to conformantly represent supplementary characters", so what travels in an SMS is in practice UTF-16. Twilio's Help Center gives the practical result: "an emoji in the message consumes 2 characters of this limit".

What different emoji cost

Many emoji are sequences of several code points that display as one picture. Each code point is paid for separately.

Emoji Built from UCS-2 units
πŸ™‚ one code point 2
❀️ a heart symbol plus an invisible variation selector 2
1️⃣ the digit 1, a variation selector and a keycap mark 3
πŸ‘πŸ½ thumbs-up plus a skin-tone modifier 4
πŸ‡΅πŸ‡° two regional-indicator letters 4
πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦ four people joined by three zero-width joiners 11

A few symbols that double as emoji, such as βœ… and ⭐, have code points inside the 16-bit range and use a single unit. They still force the switch to Unicode.

Each of the emoji above is one visible character, which is why a general-purpose counter and an SMS counter give different numbers for the same text. Why emoji can produce different character counts explains the layers.

One part becomes two

This delivery notice is exactly 100 characters, all of them in GSM-7:

Your parcel has shipped and should arrive on Thursday. Track it at example.com/track, or reply HELP.

It uses 100 of 160 units: one message with room to spare. Now put πŸŽ‰ on the end.

  1. The message can no longer be GSM-7, so it is encoded as UCS-2.
  2. The text uses 100 units and the emoji 2, for 102 in total.
  3. 102 is more than 70, so the message is split, and each part holds 67.
  4. 67 + 35 = 102. Two parts.

One part becomes three

A longer reminder, 136 characters, still fits in one GSM-7 message:

Reminder: your check-up is on Monday at 9:15am. Reply YES to confirm, or call the practice if you need to change the time. See you then!

Add a space and πŸ™‚. The total is 136 + 1 + 2 = 139 units. Two parts hold 134 at most, so this needs three: 67 + 67 + 5.

Message Encoding Units Parts
Delivery notice GSM-7 100 1
Delivery notice + πŸŽ‰ UCS-2 102 2
Reminder GSM-7 136 1
Reminder + space + πŸ™‚ UCS-2 139 3

The pattern holds for any single-message GSM-7 text with a two-unit emoji added at the end: from 69 to 132 characters it becomes two parts, and from 133 characters up it becomes three.

How much room an emoji leaves

For a message you want to keep to a single SMS:

The message contains Other characters that still fit
One two-unit emoji such as πŸ™‚ 68
One emoji with a skin tone, or one flag 66
One four-person family emoji 59
Nothing but two-unit emoji 35 emoji in total

So an emoji in a short message costs nothing extra. "Table booked for 7:30pm, see you then πŸ™‚" is well inside one part. The cost appears only when the text is long enough to cross 70 units.

Where the emoji sits can matter

A part cannot end halfway through a surrogate pair. The standard, 3GPP TS 23.040, says only that "A UCS2 character shall not be split in the middle" and does not mention surrogate pairs at all, so this comes from implementations. A comment in Android's messaging source explains the reason: "Many carriers cannot handle a fragment correctly if it does not end at a character boundary."

The effect is that a part sometimes carries 66 units instead of 67. Take 66 letters, then πŸ™‚, then 66 more letters. That is 134 units, exactly two parts' worth on paper. But the emoji would occupy units 67 and 68, across the boundary, so it moves to the second part. The parts come out as 66 + 67 + 1: three, not two.

Our counter never splits a surrogate pair. Phones can go further. Android's code tries to end each part on a whole visible character, so a long sequence such as a family emoji near a boundary may move to the next part as a block. Treat any count that lands within a few units of a boundary as uncertain.

It is not only emoji

Plenty of ordinary-looking characters are outside GSM-7 and trigger the same switch to Unicode. They use one unit each, not two, but the drop from 160 to 70 is identical:

  • curly quotes and apostrophes: β€œ ” β€˜ ’
  • the en dash –, the em dash β€” and the single-character ellipsis …
  • the non-breaking space, the bullet β€’, the backtick and the tab
  • letters GSM-7 lacks, such as Γ‘, Γ³ and lower-case Γ§

These are easier to miss than an emoji because the text looks the same. Add one curly apostrophe to a 100-character GSM-7 text and it becomes 101 UCS-2 units, which is two parts (67 + 34). The full list of what GSM-7 does contain is in What is GSM-7?

What to do about it

  • Decide on purpose. If the whole message, emoji included, is 70 units or fewer, the emoji costs you nothing in parts. Above that, weigh it against the extra parts.
  • Budget with the Unicode numbers. Once an emoji is in, plan around 70, 134 and 201 units for one, two and three parts, and count the emoji's own units.
  • Remove Unicode you did not intend. The SMS Character Counter lists every character that forces Unicode and offers GSM-7 replacements for typographic ones: straight quotes for curly quotes, a hyphen for a dash, three dots for an ellipsis, an ordinary space for a non-breaking space. It applies them only when you ask.
  • Consider a text alternative. :) is two GSM-7 units and keeps the 160 limit.
  • Check what your template inserts. A first name or product name pulled from a database can carry an emoji or an accented letter into a message that was GSM-7 when you tested it.
  • Do not rely on automatic clean-up for emoji. Twilio's optional Smart Encoding feature replaces look-alike punctuation with GSM-7 characters, but its documentation says it "does not transliterate messages that contain emoji". An emoji still forces Unicode.

These are the standard rules. Providers and carriers apply their own limits and pricing, so the counter's result is an estimate of length, not a statement of what a message will cost.