induwara.lk
induwara.lkText · Writing

Character Counter — Twitter, SMS, meta tag limits

Paste any text to see its character count alongside live progress bars for Twitter / X (280), SMS (160 GSM-7 / 70 UCS-2), meta description (160), Instagram (2,200), LinkedIn (3,000) and more. Three counting methods. Sources cited. No signup, no ads.

By Induwara AshinsanaUpdated May 11, 2026
Count characterslive as you type

Runs entirely in your browser. Nothing is uploaded, logged, or stored.

Characters
0
0 without spaces
Words
0
Lines
0
SMS segments
Add text to estimate

By counting method

UTF-16 code units
0
text.length — Twitter, SMS
Unicode code points
0
Each scalar value once
Grapheme clusters
0
What you see as one char

SMS message detail

Add some text to see SMS encoding, segment count, and the character that triggered any UCS-2 fallback.

Platform limits

Meta title (SEO)
Google truncates around this length
0/ 6060 left
Email subject line
Most inboxes truncate after 60
0/ 6060 left
URL slug
Recommended SEO-friendly ceiling
0/ 7575 left
YouTube video title
Hard limit; truncates on cards earlier
0/ 100100 left
SMS (1 segment, GSM-7)
Plain ASCII; emoji switches to UCS-2 → 70
0/ 160160 left
Meta description (SEO)
Google snippet caps around here
0/ 160160 left
Snapchat caption
Snap chat sticker text limit
0/ 250250 left
Twitter / X
Latin-script weighted count
0/ 280280 left
Bluesky post
Counted as graphemes
0/ 300300 left
Reddit post title
Hard cap enforced on submission
0/ 300300 left
Threads post
Meta's Twitter-style microblog
0/ 500500 left
Mastodon toot
Server default; some instances raise it
0/ 500500 left
Pinterest pin description
Only first 50 shown on grid
0/ 500500 left
WhatsApp Status text
Text-only status updates
0/ 700700 left
Discord message
Free-tier limit; Nitro raises to 4,000
0/ 2,0002,000 left
Instagram caption
Hashtags and @mentions count too
0/ 2,2002,200 left
TikTok caption
Raised from 150 to 2,200 in 2023
0/ 2,2002,200 left
LinkedIn post
Feed posts; articles are separate
0/ 3,0003,000 left
YouTube description
First 100–150 chars show under title
0/ 5,0005,000 left
Facebook post
Very high — full posts truncate after ~480
0/ 63,20663,206 left

Sources: SMS encoding from 3GPP TS 23.038. Twitter / X counting rules from the X Developer documentation. Search snippet limits from Google Search Central. Per-platform limits cited on hover and in the Sources section below.

How it works

The counter runs three independent character-counting passes over your text, computes SMS segmentation under the GSM 03.38 standard, and applies each platform's documented limit to the correct count. Every measurement is a pure function with no side effects; nothing leaves your browser.

  1. UTF-16 code units. The value of text.length in JavaScript. This is what Twitter / X counts for Latin text, what SMS gateways measure in UCS-2 mode, and what most APIs use in their limits. A second method walks the string by Unicode iterator and sums each scalar value's code-unit length; when the two methods agree, the "verified" badge lights up.
  2. Unicode code points. Each Unicode scalar value counted once, computed by iterating the string with for...of. An emoji like 😀 is one code point but two UTF-16 units; a regional-indicator pair like 🇱🇰 is two code points but one grapheme. Use this number when a system documents its limit in "characters" without specifying an encoding.
  3. Grapheme clusters. Computed via Intl.Segmenter with grapheme granularity (Unicode TR-29). One grapheme is what a reader perceives as one character — including flag emoji, skin-tone modified emoji, and zero-width-joiner sequences. Twitter / X and Bluesky count graphemes for their published limits, so the corresponding tiles use this number.
  4. SMS segmentation. Per 3GPP TS 23.038 the tool walks the string and checks each character against the GSM-7 default alphabet. If every character is in GSM-7 the segment cap is 160 septets (153 per part for concatenated messages, with 7 septets per part lost to the User Data Header). A single non-GSM character — an emoji, a curly quote, a Sinhala letter — switches the entire message to UCS-2 encoding and drops the cap to 70 (67 concatenated). The tool flags the exact character that triggered the switch so you can decide whether to substitute it.

Platform limits use the counting method each platform documents. Twitter / X uses a "weighted character" rule that maps to graphemes for everything except CJK; the tile uses graphemes for the broadest accuracy. SMS, meta tags, Instagram, LinkedIn, Facebook and most others count UTF-16 code units. Each tile shows its documented source on hover, and the full source list appears below.

The tool is engineered to update on every keystroke even with a megabyte of text in the textarea. Memoised computation means unrelated re-renders do not re-walk the string; the longest hot path on a 100-KB input runs in roughly 5 milliseconds on a mid-range Android phone.

Worked examples

Plain English tweet

"I love Sri Lanka — and our cricket team."

  1. All ASCII → all three counts identical
  2. UTF-16 = 41 · code points = 41 · graphemes = 41
  3. Twitter / X: 41 / 280 (ok), 239 left
  4. SMS GSM-7: 41 / 160 in one segment

Tweet with the Sri Lanka flag

"I love Sri Lanka 🇱🇰"

  1. Plain text part is 17 chars; flag is one grapheme
  2. 🇱 (U+1F1F1) and 🇰 (U+1F1F0) are surrogate pairs — 2 UTF-16 each
  3. UTF-16 = 21 · code points = 19 · graphemes = 18
  4. Twitter / X: 18 / 280 graphemes (ok)
  5. SMS: '🇱' is outside GSM-7 → UCS-2, 21 of 70 in one segment

SMS boundary — 160 ASCII chars then one more

160 'a' characters, then 161

  1. At 160: GSM-7, 1 segment, 0 chars free
  2. At 161: still GSM-7 alphabet but capacity per part drops to 153
  3. 161 ÷ 153 → 2 segments needed (capacity 306 septets)
  4. Free in last segment = 306 − 161 = 145 chars
  5. This is the 'why does my long SMS cost double?' boundary

GSM-7 extension chars

"Hello {world}"

  1. Curly braces are GSM-7 extension chars (cost 2 septets each)
  2. 11 base chars × 1 + 2 extension chars × 2 = 15 septets
  3. Still fits in 1 GSM-7 segment (≤ 160)
  4. Other extension chars: ^ [ ] ~ \ | € and form-feed

Frequently asked questions

Sources & references

Related tools

Rate this tool
Be the first to rate

Comments & feedback

Spotted a bug or want an improvement? Tell us — our team reviews every comment, and good ideas get built. Comments are public and anonymous.

Spotted a stale platform limit, an edge case, or want to suggest an improvement?

Email me at [email protected] — most fixes ship within 24 hours.