← Back to Blog
Guide

SMS Character Limits: GSM-7, Unicode & Segments

SMS Character Limits Explained: GSM-7, Unicode, and Message Segments

Quick answer: One SMS carries 160 characters with GSM-7 encoding or 70 characters with Unicode (UCS-2). Longer texts are split into segments of 153 or 67 characters respectively — and billed per segment. A single emoji or curly quote switches the entire message to Unicode, cutting capacity by 56% and often tripling cost.

Character limits look like trivia until you multiply them by a million messages. A campaign that silently crosses from one segment to two doubles its budget. Here is exactly how the encoding math works, and how to control it.

Why Is the SMS Limit 160 Characters?

SMS travels in the spare capacity of GSM signaling frames: 140 bytes (1,120 bits) per message. How many characters fit in 1,120 bits depends entirely on how many bits each character needs:

EncodingBits per characterSingle SMSPer segment (multi-part)
GSM-77160153
UCS-2 (Unicode)167067

GSM-7 packs a character into 7 bits by supporting only a fixed 128-character alphabet (plus an extension table). UCS-2 supports virtually every script and symbol, but at 16 bits per character — hence the drop from 160 to 70.

What Characters Are in the GSM-7 Alphabet?

GSM-7 covers:

  • Latin letters A–Z, a–z and digits 0–9
  • Common punctuation: . , ! ? : ; ' " ( ) + - * / = % & # @
  • A set of accented letters (é, ü, ñ, à, ö and others) and Greek capitals
  • Currency signs including the euro and pound

The extension table trap: a few characters — square brackets, curly braces, backslash, caret, pipe, tilde, and the euro sign — are in GSM-7 but cost two characters each, because they're encoded as an escape plus a code.

What Silently Switches a Message to Unicode?

Everything outside GSM-7 forces the entire message into UCS-2 — one character is enough. The usual offenders:

  • Smart punctuation pasted from Word or Google Docs: curly quotes, curly apostrophes, em dashes, ellipsis characters
  • Emoji — any of them
  • Non-Latin scripts: Chinese, Japanese, Korean, Arabic, Hebrew, Thai, most Cyrillic
  • Invisible characters: non-breaking spaces, zero-width joiners from copy-paste

The cruelest case is the curly apostrophe: visually near-identical to the straight ASCII one, but it turns a 160-character message into a 3-segment Unicode send.

How Does Message Concatenation Work?

When a message exceeds the single-SMS limit, it is split into parts, each carrying a User Data Header (UDH) — 6 bytes that tell the receiving phone "this is part 2 of 3." That header consumes payload space, which is why per-segment capacity drops:

Message length (GSM-7)SegmentsBilled messages
1–160 characters11
161–306 characters22
307–459 characters33
460–612 characters44

For Unicode the breakpoints are 70, then 134, 201, 268. The phone reassembles the parts into one bubble — the user never sees the split, but your invoice does: every segment is billed as a full message.

How Much Do Encoding Mistakes Actually Cost?

Take a 155-character promotional message to 500,000 recipients at $0.01 per segment:

  • Clean GSM-7: 1 segment × 500,000 = $5,000
  • Same text with one emoji: 70-char Unicode segments → 3 segments × 500,000 = $15,000

One character, $10,000 difference. This is the most common silent budget leak in SMS marketing — and it's fully preventable.

How Do You Keep Messages in One Segment? (6 Rules)

  1. Know your real limit. 160 for GSM-7, 70 for Unicode. If your audience requires a non-Latin script, plan copy around 70/67 from the start.
  2. Strip smart punctuation. Normalize curly quotes, apostrophes, and dashes to ASCII before sending. Automate this in your pipeline — humans paste from Word.
  3. Treat emoji as a paid feature. In marketing they can earn their cost through engagement; in OTPs and alerts they are pure waste.
  4. Watch the extension table. Brackets, braces, tilde, caret, pipe, and the euro sign each count double in GSM-7.
  5. Check segment counts in the API response. Good providers return the encoding and segment count per message — alert when a template's count changes.
  6. Mind URLs and personalization. A long link or an unexpectedly long first name can push a borderline template into the next segment. Leave 10–15 characters of headroom.

Does Any of This Apply to RCS or WhatsApp?

No — RCS, WhatsApp, and other IP messaging channels don't use GSM encoding or 140-byte frames, so there's no 160-character limit and no per-segment billing. But every RCS or rich-channel campaign needs an SMS fallback, and the fallback text obeys every rule in this guide.

ViteMobile's API returns encoding and segment count for every message, and the dashboard flags templates whose segment count drifts — so a pasted curly quote gets caught before it multiplies across a million sends.

Key Takeaways

  • One SMS = 140 bytes: 160 GSM-7 characters or 70 Unicode characters. Multi-part segments hold 153/67.
  • A single non-GSM character — an emoji, a curly quote — switches the whole message to Unicode and can triple cost.
  • Some GSM-7 characters (brackets, euro sign, tilde) silently count double.
  • Normalize punctuation automatically, keep headroom for personalization, and monitor segment counts per template in production.

Frequently Asked Questions

Q: How many characters can an SMS contain? A: 160 with GSM-7 encoding, 70 with Unicode. Longer messages split into segments of 153 (GSM-7) or 67 (Unicode), each billed as a separate message.

Q: Why did my SMS get split into multiple messages? A: It exceeded the single-message limit, or a special character switched it to Unicode. Concatenation headers reduce each part's capacity to 153/67 characters, and each part is billed separately.

Q: Do emojis count as more characters in SMS? A: Yes — any emoji forces the whole message to Unicode (70-character limit), and most emoji occupy two code units themselves. One emoji can turn a 1-segment message into a 3-segment send.

Q: Which characters break GSM-7 encoding? A: Curly quotes and apostrophes, em dashes, ellipsis characters, non-breaking spaces, and any non-Latin script. Brackets, braces, tilde, caret, pipe, and the euro sign stay GSM-7 but count double.

Q: How do I keep my SMS in one segment? A: Count against the correct limit, auto-normalize smart punctuation to ASCII, avoid emoji in transactional texts, leave headroom for personalization, and monitor the segment count your API returns.