BroadNet
SMS encodingCharacter sets

UCS-2 and Unicode SMS

Updated 2 min readStandards-based
Direct answer

UCS-2 is the 16-bit encoding SMS uses for any text that contains characters outside the GSM-7 alphabet — non-Latin scripts, emoji, curly quotes. Each character takes two octets, so a single UCS-2 SMS holds 70 characters and concatenated segments hold 67 each. A single non-GSM-7 character forces the whole message to UCS-2.

§01

Why SMS needs UCS-2

GSM-7 covers only 128 characters plus a small extension set. Anything else — Arabic, Chinese, Cyrillic, Hebrew, Thai, emoji, and even typographic characters like curly quotes and en-dashes — is not representable. For those, SMS switches to UCS-2, a fixed-width 16-bit encoding (effectively UTF-16 big-endian for the Basic Multilingual Plane). It is signalled by data_coding 0x08.

§02

Capacity: 70 and 67

The SMS user-data field is 140 octets. At two octets per character, UCS-2 fits 70 characters in a single message. When a message is concatenated, the 6-byte User Data Header consumes payload, leaving 134 octets — 67 characters per segment. This is less than half of GSM-7's capacity, which is why encoding choice has a large cost impact.

Per-message capacity by encoding
EncodingSingle SMSPer concatenated segment
GSM-7 (7-bit)160 chars153 chars
8-bit binary140 bytes134 bytes
UCS-2 (16-bit)70 chars67 chars
§03

What triggers UCS-2

Encoding is all-or-nothing per message: a single character outside GSM-7 forces the entire message to UCS-2, dropping capacity from 160 to 70. Common culprits are easy to introduce accidentally — a curly apostrophe from a word processor, an em-dash, an emoji, or a non-Latin name. Detecting these before sending is the single biggest lever on SMS cost.

Characters that force UCS-2
CategoryExamples
Emoji😀 ✅ 🚀 ❤️
Smart punctuation' ' “ ” – — …
Non-Latin scriptsالعربية · 中文 · Кириллица · עברית · ไทย
Accented letters not in GSM-7â ê î ô û ã õ ą ę ř
§04

The surrogate-pair caveat

UCS-2 is strictly 16-bit and covers the Unicode Basic Multilingual Plane. Characters above U+FFFF — many modern emoji, for instance — are represented in UTF-16 as surrogate pairs of two 16-bit code units, so a single such emoji consumes four octets (two UCS-2 'characters'). A message that looks like one emoji can therefore count as two toward the 70/67 limit.

FAQ

Frequently asked

How many characters fit in a Unicode SMS?

70 characters in a single UCS-2 message, and 67 per segment when the message is concatenated. That is because each character is 16 bits (two octets) against the 140-octet SMS payload limit.

What makes an SMS switch to UCS-2?

Any single character outside the GSM-7 alphabet — an emoji, a curly quote, an em-dash, or non-Latin text — forces the entire message to UCS-2. Encoding is chosen per message, not per character.

Is UCS-2 the same as UTF-16?

Nearly. UCS-2 is fixed 16-bit and covers the Basic Multilingual Plane. SMS treats the payload as UTF-16 big-endian, so characters above U+FFFF (many emoji) become surrogate pairs and take four octets.

Why does one emoji sometimes count as two characters?

Emoji above U+FFFF are encoded as UTF-16 surrogate pairs — two 16-bit code units — so a single glyph consumes two of the 70 (or 67) available UCS-2 character slots.

How do I avoid accidentally sending UCS-2?

Sanitise input before sending: replace smart quotes and dashes with their ASCII equivalents, strip or transliterate stray accents, and check for emoji. A GSM-7/Unicode checker flags the exact characters forcing UCS-2.

References

Source specifications

The published standards this page is grounded in. Opens in a new tab.

BNMaintained by the BroadNet engineering team·Carrier-grade messaging since 2003
Put it on the wire

Build with a real SMPP bind and REST API.

Request test access with real test keys: send to your own verified number first, then move to production across 200+ countries once your sender identity and routes are approved.