Twitter / X Character Counter
Count characters against the 280-limit as you draft a post.
How X counts characters
A standard X (Twitter) post allows 280characters, but the count isn't a string length — it's a budget of weight. X's published algorithm charges most Latin, Greek, Cyrillic and Arabic characters 1, and everything else 2. So emoji cost 2 each, and a post written in Chinese or Japanese runs out at 140 characters rather than 280. Every URL — no matter how long — is shortened to a t.co link and charged a flat 23.
Emoji built from several parts are charged per part, not per picture. A family emoji like 👨👩👧👦 is one character to you, but X sees four people joined by three invisible joiners and charges 4×2 + 3×1 = 11. That is why this page shows “Characters Typed” and “Weighted Count” as two separate numbers: the first is what you wrote, the second is what the 280 is spent against. Both are computed in your browser — nothing is sent anywhere.
Built and maintained by Meet Shah · Last updated
What this tool is used for
- Drafting a post against the character limit as you type.
- Trimming a post that is slightly over without losing the point.
- Checking whether a link leaves room for the message.
- Comparing two drafts on length before choosing which to publish.
- Checking a post fits before adding it to a scheduling queue.
Frequently Asked Questions
- Why does X count some characters as two?
- Because it is a weighted budget, not a character count. Latin, Greek and Cyrillic ranges weight 1; everything else — CJK, emoji, most other scripts — weights 2. That is the published `twitter-text` algorithm rather than an approximation of it.
- How are URLs counted?
- As a flat 23 characters regardless of actual length, because every link is wrapped in the t.co shortener. A 200-character URL and a 20-character one cost the same, which is why shortening a link before posting saves nothing at all.
- Does an emoji count as one?
- Rarely. `emojiParsingEnabled` does not collapse a zero-width-joiner sequence, so a family emoji costs 11 — each joiner counts. A single-code-point emoji costs 2. This is the detail that makes `.length` and a grapheme count both wrong.
- Why do three different length measurements disagree?
- Because they answer different questions. `.length` counts UTF-16 code units, `Array.from().length` counts code points, a grapheme count counts what a human sees — and none of them is the weighted budget X actually enforces.
- What is the current limit?
- 280 weighted units for a standard post, with a much higher ceiling for subscribers. The limit is on the weighted total, so a post in Japanese fits roughly half as many characters as one in English — which is what the weighting was designed to equalise.
Common errors and gotchas
- Counting a link at its literal length, when the platform substitutes a fixed length for every URL.
- Counting emoji and CJK characters as one unit each, which the platform weights differently.
- Forgetting a leading mention behaves differently from one mid-post.
- Assuming the limit is stable, since it has changed and differs by account type.
- Writing to the limit rather than to the point.