SMS character and segment counter
GSM-7 and UCS-2 countedLimits read 2026-10-22Runs in your browser
Paste a text message and see what your provider will actually send: the encoding, the character count, the number of segments you pay for, and the exact characters that pushed it into UCS-2, with a one-click swap for smart quotes and dashes. It also checks that the STOP line and your brand name are in the text and shows how many segments the footer costs. Nothing you paste leaves this page.
What it counts
An SMS carries 140 bytes. In GSM-7, the default alphabet of the GSM 03.38 standard, each character takes 7 bits, so one message holds 160 characters. One character outside that alphabet switches the whole message to UCS-2, 16 bits a character, and the limit falls to 70. Past the single limit the message goes out in segments, each carrying a 6-byte header that tells the phone how to stitch them back, which leaves 153 GSM-7 or 67 UCS-2 characters a part. Twilio notes one exception: toll-free multi-segment texts to the US or Canada carry 152 and 66.
The alphabet is smaller than it looks. It has 128 codes (one is the escape into an extension table), and the 10 extension characters, such as €, [ and {, cost two septets each. The counter shows characters as a reader counts them and the encoded length the limits apply to, and like Twilio's own calculator it never splits an emoji or an escape pair across two segments. Twilio's example, 152 GSM-7 characters and a single Unicode character, comes out at 3 segments here as it does there.
Segments matter twice in a compliance program: they set the bill, and the opt-out footer the carriers expect has to fit inside them. The rules for what a marketing text must carry are in TCPA rules for text messages; how 10DLC registration reviews your samples is in what is 10DLC.
Worked example: six real-world texts
Six messages a small business might send, each with the footer Reply STOP to opt out. on its own line, counted by the same functions the counter runs. The second and third rows are the same promo: one written in a plain field, one pasted from a word processor.
| Message | Encoding | Characters | Encoded length | Body alone | With footer | What it shows |
|---|---|---|---|---|---|---|
| Appointment reminder | GSM-7 | 125 | 125 septets | 1 | 1 | Plain GSM-7 with the footer: one segment with room to spare. |
| Promo, straight quotes | GSM-7 | 150 | 150 septets | 1 | 1 | The calculator's default after the fix. |
| Same promo, smart quotes | UCS-2 | 150 | 150 UCS-2 units | 2 | 3 (67 + 67 + 16) | One em dash and two curly quotes switch the message to UCS-2. |
| Promo with € and brackets | GSM-7 | 139 | 142 septets | 1 | 1 | Still GSM-7, but €, [ and ] cost two septets each. |
| Promo with one emoji | UCS-2 | 100 | 101 UCS-2 units | 2 | 2 (67 + 34) | One emoji: UCS-2, and it takes two units on its own. |
| Rent reminder near the limit | GSM-7 | 179 | 179 septets | 1 | 2 (153 + 26) | Fits one segment alone; the footer line tips it into two, and every part then carries a header. |
- 01
Appointment reminder: Lakeside Vet: Max is due for his checkup Tue 11/10 at 3:15pm. Reply C to confirm or call 555-010-4471. Reply STOP to opt out.
- 02
Promo, straight quotes: Harbor Dental: Fall cleaning slots are open - book by Oct 31 and get a free whitening kit. Reply "BOOK" or call (555) 010-2398. Reply STOP to opt out.
- 03
Same promo, smart quotes: Harbor Dental: Fall cleaning slots are open — book by Oct 31 and get a free whitening kit. Reply “BOOK” or call (555) 010-2398. Reply STOP to opt out.
- 04
Promo with € and brackets: Northwind Outfitters: [Members] take €20 off jackets this weekend with code NW20 at checkout. Shop now: nwout.co/j20 Reply STOP to opt out.
- 05
Promo with one emoji: Bean & Co: Your 10th coffee is on us 🎉 Show this text at any store by Sunday. Reply STOP to opt out.
- 06
Rent reminder near the limit: Ridgeway Property Mgmt: Reminder, rent is due Nov 1. Payments after the 5th incur the late fee in your lease. Pay at ridgewaypm.co/pay or call 555-010-9930. Reply STOP to opt out.
Characters that switch the encoding
Twilio's docs name the usual culprit: “Text editors designed for writing might automatically add angled smart quotes, non-standard spaces, or punctuation which looks similar to GSM-7 but is a different Unicode character.” The fix button swaps the look-alikes in the first four rows; the rest have no GSM-7 twin.
| Characters | What they are | Effect | The fix swaps in |
|---|---|---|---|
| “ ” ‘ ’ | Curly (smart) quotes and apostrophes from a writing app | Forces UCS-2 | " and ' |
| — – ‐ | Em dash, en dash, typographic hyphen | Forces UCS-2 | - |
| … | The one-character ellipsis | Forces UCS-2 | ... |
| U+00A0 U+2009 U+200B | No-break, thin and zero-width spaces, invisible after a copy-paste | Forces UCS-2 | A plain space, or removed |
| 🎉 👍🏽 | Emoji, most of which take two 16-bit units each | Forces UCS-2 | None: cut it or budget for it |
| á í ó ú â ê ô ã õ ç | Accented letters outside the GSM-7 alphabet | Forces UCS-2 | None: reword or budget for it |
| ^ { } \ [ ~ ] | € | The extension table (plus form feed) | Stays GSM-7, counts as two | Not needed; watch it near 160 |
Not every accent is a problem. These sit in the GSM-7 alphabet at one septet each: £ ¥ è é ù ì ò Ç Ø ø Å å Δ Φ Γ Λ Ω Π Ψ Σ Θ Ξ Æ æ ß É ¤ ¡ Ä Ö Ñ Ü § ¿ ä ö ñ ü à. Small ç is the odd one: Unicode's mapping puts it at code 0x09, the ETSI table draws a capital there, and Twilio's encoder sends capital Ç as GSM-7 and small ç as UCS-2. The counter follows the provider, which errs toward the higher count.
The opt-out line and the brand name
The footer is the part of a marketing text nobody wants to pay for and nobody can drop. CTIA's Messaging Principles (§ 5.1.3) say: “Message Senders should state in the message how and what words effect an opt-out. Standardized “STOP” wording should be used for opt-out instructions”. The opt-in confirmation that starts a recurring program must carry “(1) the program name or product description” and “(3) how to opt-out” among its five parts (§ 5.1.2.1). On the carrier-registration side, Twilio's 10DLC campaign form says of the sample messages: “The Brand must be identified by name and/or website in each message.” The counter checks both: a STOP instruction, and the brand name you type.
The legal side is wider than the keyword. Under 47 CFR § 64.1200(a)(10) a person may revoke consent “by using any reasonable method”, and replying “stop,” “quit,” “end,” “revoke,” “opt out,” “cancel,” or “unsubscribe” counts on its own. The FCC's newer order, FCC 26-67, is adopted but not yet in effect: it would let a sender “designate an exclusive revocation method”, disclosed clearly in the text itself. Either way, the footer is where the instruction lives. The keyword mechanics are in SMS opt-out keywords, and the full carrier rulebook in CTIA messaging guidelines.
What it costs: “Reply STOP to opt out.” on its own line is 23 septets. In a GSM-7 message that leaves 137 for the body before a second segment, and once a message splits, every part drops to 153. In a UCS-2 message the same line takes 23 of the 70 units, a third of the room. That is why a smart quote in the body hurts twice: it shrinks the space and the footer still has to fit.
If your platform appends its own opt-out or brand text, count that text, not only what you typed: put it in the footer field. For the full opt-in and confirmation wording, the SMS opt-in language builder writes each message and shows its segment count. This counter is a counting aid, not legal advice.
Segments on the bill
SMS is billed by the segment, not by the message: Twilio's docs say plainly that “Twilio bills SMS per message segment sent”. At a per-segment price, a three-segment promo to a list costs three times the one-segment version. Put your own per-segment price in the optional field and the record shows the cost of one message, of the whole send, and what the fix saves. We publish no prices here; the way a US bill is built is in Twilio SMS pricing explained, and the registration side in the 10DLC registration cost calculator.
Long is allowed, but Twilio caps a message at 1,600 characters and “recommends keeping SMS messages under 320 characters”. Toll-free numbers split slightly smaller parts than 10DLC (see 10DLC vs toll-free); switch the sending number in the counter to see it.
- 01Paste from a plain-text field, or run the fix: curly quotes, long dashes and odd spaces are the usual reason a short text goes UCS-2.
- 02Keep emoji out of bulk promos unless the message is already UCS-2 for another reason (a name, a language).
- 03Write to the limit, not past it: a GSM-7 body that stays inside the room left after the footer stays one segment.
- 04Count extension characters near the edge: €, brackets, braces, ~, ^, \ and | cost two septets each.
Sources
The character set comes from the Unicode Consortium's mapping of the ETSI GSM 03.38 alphabet; the segment sizes, the toll-free exception and the encoder's edge cases from Twilio's own documentation and source code; the opt-out and brand wording from CTIA and Twilio's 10DLC form. All read on 2026-10-22. Comparing providers? The SMS API provider comparison reads each one's compliance features. This is a counting aid, not legal advice.
- GSM 03.38 to Unicode mapping table (Unicode Consortium, based on ETSI TS 100 900)fetched 2026-10-22
- How long can a message be? (Twilio Docs: 160/153, 70/67, toll-free 152/66, 1,600 characters)fetched 2026-10-22
- What is GSM-7 character encoding? (Twilio Docs: escape characters count as two)fetched 2026-10-22
- What is UCS-2 character encoding? (Twilio Docs: 6-byte User Data Header)fetched 2026-10-22
- Twilio message-segment-calculator source: Unicode-to-GSM map, smart-encoding map, grapheme segmentingfetched 2026-10-22
- A2P 10DLC: gather business information (Twilio Docs: message samples and opt-in message)fetched 2026-10-22
- CTIA Messaging Principles and Best Practices (May 2023), § 5.1.2.1 and § 5.1.3fetched 2026-10-22
- 47 CFR § 64.1200(a)(10): revoking consent (eCFR)fetched 2026-10-22
- FCC 26-67, consent revocation order (adopted 2026-09-30, not yet in effect)fetched 2026-10-22