How X counts characters
The counter under X's post box looks simple: type a letter, lose a character. Then you paste in an emoji and lose two. You add a long link and the counter jumps by 23, not by the link's length. Behind the counter is a system X calls weighted character counting, and once you know its handful of rules the surprises stop.
This guide follows X's public developer documentation on counting characters and the configuration file of twitter-text, the open-source library Twitter released so that apps could count the same way it does.
The limit is 280 weighted units
A standard post can hold 280 "weighted" characters. Every character gets a weight of 1 or 2, and the total has to stay at or under 280.
Twitter doubled the old 140-character limit to 280 for most languages in November 2017. It said that before the change, 9% of English-language posts ran into the limit; afterward, only 1% did. Chinese, Japanese and Korean stayed effectively at 140, and the weighting system is how that works under one shared limit.
Which characters count as 1
In twitter-text's current configuration (version 3), these count as one unit each:
- Unicode code points 0 to 4351. That range covers Latin letters with and without accents, Greek, Cyrillic, Armenian, Hebrew, Arabic, Devanagari, Thai, Georgian and many other scripts, plus digits, ordinary punctuation and the space.
- A few small ranges of general punctuation: spaces of different widths, dashes, curly quotes and prime marks.
So "café", "Москва" and "مرحبا" each cost one unit per letter, exactly like "hello".
Which characters count as 2
Everything outside those ranges has the default weight of 2. In practice that means:
- Chinese, Japanese and Korean characters. 140 of them fill a post. This is why posts in those languages stayed at the old length when everyone else got 280.
- Emoji. Every emoji counts as 2.
- Many less common symbols and scripts whose code points sit above 4351.
The emoji rule is generous in one way. Many emoji are built from several code points: a thumbs-up with a skin tone is two, a family emoji joins several people with invisible zero-width joiners, and flags are pairs of regional indicator letters. X counts each of these as a single emoji, so each costs 2 regardless of how many code points it contains. The joiners themselves add nothing.
Links always count as 23
X wraps every link in its t.co shortener. Whatever the original address looks like, a 15-character domain or a 300-character tracking URL, it counts as 23 units.
Two consequences:
- Shortening a link yourself before posting saves nothing. A bit.ly-style link still counts as 23.
- A very short link actually costs more than its length. "x.com" written as a link counts as 23, not 5.
What doesn't count
- Media. Photos, GIFs and videos attached through X's own apps count as zero. Twitter stopped counting attached media against the limit in 2016.
- Automatic @mentions in replies. When you reply, the names X fills in at the start of your reply don't count toward 280. Twitter excluded these from the count in 2017.
Anything you type yourself does count, including @mentions you add in the middle of a post and every character of a hashtag, the # sign included.
Normalization: why "é" isn't two characters
Some characters can be stored two ways. An "é" might be one code point (é) or two ("e" plus a combining accent). They look identical but would count differently if X counted raw code points.
X avoids this by converting text to Unicode Normalization Form C (NFC) before counting. NFC merges a letter and its accent into one code point wherever such a code point exists. So "café" counts as 4 whichever way your keyboard produced it.
A worked example
Take this post:
Pancake Sunday at the café 🥞 menu: https://example.com/brunch-menu-2026-autumn-edition
- "Pancake Sunday at the café " is 27 characters, all weight 1 (the "é" counts once after normalization).
- 🥞 is one emoji: 2.
- " menu: " is 7.
- The link counts as 23, even though it is 51 characters long.
Total: 27 + 2 + 7 + 23 = 59 of 280.
Longer posts
X lets paying subscribers publish posts well beyond 280 characters, and the ceiling has gone up several times since long posts were introduced in 2023. Those posts appear truncated in timelines with a "Show more" link. The weighting rules above still apply to how characters are counted; only the limit changes. If you write for a mixed audience, it helps to put the main point in the first 280 characters, because many readers won't tap through.
Practice
The 280 Challenge uses these same rules. It gives you a long, rambling sentence and a live counter that weights emoji, CJK characters and links the way X does. Cutting a 400-character sentence down to 280 without losing the facts is good practice for the real thing.
Tweet Test is an independent site and is not affiliated with X Corp. The rules here come from X's published developer documentation and the twitter-text configuration on GitHub; X can change them, so if the counter in the app ever disagrees with this page, the app wins.
Sources: X developer documentation, "Counting characters"; twitter-text configuration, version 3; CNBC on the 280-character rollout, November 7, 2017.
Questions
Do spaces count as characters on X?
Yes. A space counts as one character, the same as a letter or a punctuation mark.
Does a photo use up characters?
No. Photos, videos and GIFs attached in X's own apps count as zero characters.
How long can a post be with Premium?
Paid subscribers can publish much longer posts than 280 characters. The exact ceiling has changed over time, so check X's Premium page for the current figure.