Character Counter — SMS & Social Limits

Live counts of characters, words, sentences, lines, and paragraphs — plus real SMS segmentation: which encoding your message uses, which characters cost double, and exactly how many segments you’ll be billed for. Everything runs in your browser.

Why one emoji shrinks an SMS from 160 to 70 characters: SMS has two encodings. GSM-7 packs 160 characters into a message but covers only a fixed alphabet; the moment any character outside it appears — an emoji, a smart quote, most accented letters — the whole message switches to UCS-2, which fits just 70. Longer messages split into segments of 153 (GSM-7) or 67 (UCS-2), and carriers bill per segment.
GSM-7
Legend: amber = extended GSM character, costs 2 · red = outside GSM-7, switches the whole message to UCS-2

Platform limits — live check

ContextLimitYoursStatus

Limits are generic public figures, may change at any time, and some platforms count certain characters differently (see the counting-rules section below).

Your text never leaves this page — no uploads, no servers, works offline once loaded.

[ Ad slot — replace with AdSense / Ezoic code ]

SMS segments, explained properly

An SMS is not “160 characters” — it’s 140 bytes, and everything follows from how characters are packed into those bytes. The default packing, GSM-7, uses 7 bits per character: 140 bytes × 8 bits ÷ 7 = 160 characters. But GSM-7 only encodes a fixed alphabet from 1980s European telephony: unaccented Latin letters, digits, common punctuation, a handful of accented letters (é, ü, ñ, ö…), and some Greek capitals. Nine characters — € [ ] { } \ ^ | ~ and form feed — live in an extension table and cost two 7-bit slots each (an escape plus the character), which is why a message full of brackets runs out of room early; this page highlights them in amber as you type.

Any character outside all of that — an emoji, a smart quote “ ”, an em dash —, most accented letters, any non-Latin script — can’t be encoded in GSM-7 at all, so the entire message switches to UCS-2: 16 bits per character, 140 bytes ÷ 2 = 70 characters. One emoji doesn’t cost one character; it costs you the encoding. (Emoji outside the Basic Multilingual Plane, which is most of them, take two UCS-2 code units — so a single 🎉 uses 2 of your 70.)

When a message exceeds one SMS, it’s split into segments, and each segment gives up 6 bytes to a concatenation header telling the phone how to reassemble them. That shrinks per-segment capacity to 153 (GSM-7) or 67 (UCS-2). Carriers and SMS APIs bill per segment — a 500-character message with one emoji is 8 billable segments; the same message without it is 4. The segment counter above does this math exactly, including the extended-character double cost.

Platform limits

The table in the tool checks your text live against widely published limits: a post on X (280 characters for standard accounts), an Instagram caption (2,200) and bio (150), a LinkedIn post (3,000), a Discord message (2,000), a YouTube title (100), one SMS segment, an HTML title tag (~60 characters before search results truncate it), and a meta description (~160, though search engines actually truncate by pixel width, so ~160 is a guide rather than a wall). These numbers are the platforms’ generic public figures — they change at their owners’ discretion, and this site isn’t affiliated with any of them.

Counting rules: do emojis and URLs count differently?

Often, yes — a platform’s “character count” is frequently not text.length. Three cases worth knowing. Emoji: most emoji are multiple UTF-16 code units (and flag or family emoji are several codepoints joined invisibly), so naive counters over- or under-count them; some platforms count an emoji as 2, others as 1 grapheme. URLs: on X, every link is wrapped by the t.co shortener and counts as a fixed 23 characters regardless of its real length. Weighted characters: X counts most CJK characters as 2 toward its 280. This page reports honest Unicode counts (code points, with the SMS panel additionally doing code-unit math where that’s what’s billed) — treat platform-specific weighting as the platform’s own final word.

What each count means here

Characters counts Unicode code points — an emoji is 1, even when it’s 2 UTF-16 units (the SMS panel, where units are what’s billed, counts units). Without spaces excludes all whitespace. Words are runs of letters/digits. Sentences split on . ! ? followed by space or end — abbreviation-heavy text will over-count slightly, as every sentence counter does. Paragraphs are blocks separated by blank lines.

Frequently asked questions

Why does my message say UCS-2 when I don’t see any emoji?

Look for red-highlighted characters in the encoding view — the usual culprits are invisible or near-invisible: smart quotes (“ ” ‘ ’) auto-inserted by phone keyboards and word processors, em/en dashes from autocorrect, non-breaking spaces from copied web text, or accented letters outside GSM-7’s small accented set. Replace them with their plain equivalents and the message drops back to GSM-7. The Invisible Character Detector finds the truly invisible ones.

Is one long SMS cheaper than several short ones?

Billing is per segment either way — a 3-segment message costs the same as three 1-segment messages on nearly every carrier and API. The reason to care about segmentation is staying under a boundary: trimming a 161-character GSM-7 message by one character halves its cost.

Why do different counters give different numbers for the same text?

They’re counting different things: UTF-16 code units (JavaScript’s .length — counts 🎉 as 2), Unicode code points (counts 🎉 as 1), or grapheme clusters (counts 👨‍👩‍👧 as 1 instead of 5). This page counts code points for the general counts and code units in the SMS panel, because that’s what each context actually measures.

Is my text uploaded anywhere?

No — all counting runs in your browser tab with no server or network request, and the page works offline once loaded.

[ Ad slot — replace with AdSense / Ezoic code ]

Related tools