You paste a draft into a notes app, it says 262 characters, and X still won’t let you post it. Or the opposite: a post that looks far too long goes through with room to spare.
Both happen because X doesn’t count characters the way a word processor does. It uses a weighted count: some characters cost 1, some cost 2, and every link costs a flat 23 no matter how long it is. Once you know the rules, the surprises go away.
This guide explains each rule with tested examples, shows how to check a draft with Xholic’s free Twitter character counter, and covers the cases where the number you see and the number X uses can still differ. If you only need the limits themselves (280 for standard posts, more for Premium, separate caps for bios and DMs), our Twitter character limit guide covers those.
The weighting rules at a glance
X publishes its counting rules as an open-source library called twitter-text. The counter uses that library (version 3.1.0), so every number below comes from running real text through it. Numbers in brackets are the length a normal editor shows.
| What you type | Example | Counts as |
|---|---|---|
| Latin letters, digits, spaces | Found a new cafe in Tokyo (25) |
25 |
| A line break | one press of Enter | 1 |
| Any link, long or short | a 122-character URL with UTM tags | 23 |
| A bare domain | xholic.ai (9) |
23 |
| Any single emoji | 🚀 | 2 |
| A combined emoji | 👨👩👧👦 (four people joined into one) | 2 |
| Chinese, Japanese or Korean | 東京で新しいカフェを見つけた (14) |
28 |
| @mentions, #hashtags, $cashtags | @xholicai (9) |
9 |
| Unicode “bold” letters | 𝗕𝗼𝗹𝗱 (4) |
8 |
The underlying rule is simple. Each character has a weight of 1 if its Unicode code point falls in the range U+0000 to U+10FF, which covers Latin, Greek, Cyrillic, Hebrew, Arabic, Devanagari, Thai and most accented letters, or in a few punctuation blocks (typographic spaces, dashes and curly quotes). Everything else weighs 2. Links and emoji are handled separately before that rule applies.
How to check a post’s length, step by step
The counter is a single text box with a live result underneath. Here is the whole tool, with numbers that match the steps below.

Step 1: Paste the draft exactly as you’ll post it
Put the full post into Post text (1), including links, emoji, hashtags and blank lines. The count only matches X’s if the text matches too, so don’t strip the link or emoji “to check them later”. The box starts with a short sample sentence; select it and paste over it.
Step 2: Read the weighted length
Weighted length (2) is the number X checks. In the example, the draft is 182 characters long in a normal editor. The 75-character tracking link only costs 23, the two bullets cost 2 each, and the rocket emoji costs 2, so the weighted length is 133. The line under it says “Fits in a standard post” or “Over the standard post limit”, or prompts you to start typing while the box is empty.
Step 3: Check what’s left
The second box (3) shows Remaining out of 280. When you go over, the label switches to Over by and shows how many characters to cut.
Step 4: Watch the bar while you edit
The bar (4) fills as you type and turns from purple to yellow once you pass 280. It updates on every keystroke, so you can trim a sentence and see the effect immediately.
The note at the bottom (5) is a reminder of the two rules that cause most surprises: links and emoji.
Everything runs in your browser. The text you type isn’t uploaded or stored; the only analytics event is a single “result generated” signal the first time you edit, with no text attached.
Links always count as 23
X wraps every link in its t.co shortener, so it charges a fixed 23 characters per link regardless of what you paste. The top half of this comparison is a 122-character URL with tracking parameters. The counter, like X, charges 23.

What this means in practice:
- Don’t shorten links to save space. A bit.ly link and a 300-character tracking URL cost the same 23. Shorten for readability if you like, not for the count.
- Short links can cost more than they look. Anything twitter-text recognises as a link counts as 23, including bare domains.
x.aiis 4 characters on screen and 23 in the count. - Each link is charged separately. Two links cost 46 before you’ve written a word.
- Typing a domain by accident counts too. A file name or a domain in a sentence (
example.com) becomes a link and costs 23. If that’s a problem, rephrase it.
Images, GIFs and videos you attach through X’s composer don’t count at all, according to X’s developer documentation on counting characters.
Every emoji counts as 2
Since version 3 of twitter-text, X treats each emoji as a single unit with a weight of 2, however it’s built. That’s the bottom half of the image above: a family emoji made of four people joined by invisible zero-width joiners, a flag made of two regional letters, and a thumbs-up with a skin-tone modifier. In raw code units that’s 19. X counts 6.
So you don’t need to avoid flags or skin tones for length reasons. You do need to remember that ten emoji take 20 characters, which adds up quickly in a list post where every line starts with one.
Chinese, Japanese and Korean count as 2
Characters outside the 1-weight ranges cost 2, and that includes all CJK scripts: Chinese hanzi, Japanese kanji, hiragana and katakana, and Korean hangul.

In effect, a post written entirely in Chinese, Japanese or Korean has room for 140 characters, not 280. That’s not as restrictive as it sounds: a CJK character usually carries more meaning than a Latin letter, so the same idea often fits in fewer of them.
Languages that use Latin, Greek, Cyrillic, Arabic, Hebrew, Devanagari or Thai script count 1 per character, the same as English. Accented letters count as 1 whether they are typed as one character or as a letter plus a combining accent, because X normalises text (Unicode NFC) before counting.
Spaces, line breaks, symbols and fancy fonts
These are the quieter rules that explain most “off by a few” differences.
- Spaces count as 1. So do tabs, and so do invisible characters like zero-width spaces that sometimes come along when you copy text from a web page or a document.
- Each line break counts as 1. A blank line between paragraphs costs 2: one for the end of the line and one for the empty line.
- Some common symbols cost 2. The single ellipsis character (…) costs 2, while three periods (…) cost 3. Bullets (•), arrows (→), check marks (✓), stars (★), the euro sign (€) and the trademark sign (™) all cost 2. The pound (£), degree (°) and copyright (©) signs cost 1. Straight and curly quotes and the em dash cost 1.
- Styled “fonts” cost double. The bold, italic and script letters made by font generators are Unicode math symbols, not formatted text, so each one costs 2. A 40-character headline in bold uses 80. Our Twitter Font Generator guide covers when styled text is worth that cost.
- @mentions, #hashtags and $cashtags count character for character, including the symbol.
Replies, threads and Premium long posts
The counter checks one post against the standard 280 limit. A few situations need a bit of interpretation.
Replies. When you reply on X, the @mentions it adds automatically at the start of the reply don’t count toward the limit; a mention you type yourself does. The counter can’t tell them apart, so remove the leading auto-added mentions before you paste a reply in.
Threads. Each post in a thread has its own 280 budget. Check them one at a time. If a single idea is 100 characters over, it’s usually cleaner to split it at a natural break than to squeeze it. Our guide to writing Twitter threads covers how to structure the split.
Premium long posts. X Premium subscribers can post up to 25,000 characters. The counter still compares against 280, which is useful in a different way: only the opening part of a long post shows in the timeline before readers tap “Show more”, so treat the first 280 as your hook and make sure it stands on its own.

How to trim a post that’s over the limit
When the counter says you’re over, cut in this order. It’s usually faster than rewriting.
- Check the expensive pieces first. Count the links (23 each), emoji (2 each), styled letters (2 each) and blank lines. Removing one unnecessary link saves more than rewording a sentence.
- Swap 2-cost symbols for 1-cost ones where it doesn’t hurt the look: a hyphen instead of a bullet, “to” instead of an arrow.
- Cut the warm-up. Openers like “Here’s the thing:” or “I’ve been thinking about this a lot” rarely add meaning.
- Remove repeated ideas. If the last sentence restates the first, keep the sharper one.
- Split it. If you’re still well over, it’s two posts or a short thread, not one dense one.
Troubleshooting: when the count doesn’t match
My editor shows fewer characters than the counter. Look for CJK text, emoji, bullets, arrows, styled letters or “…”. Each costs 2 in X’s count but 1 or less in most editors.
My editor shows more characters than the counter. You almost certainly have a link. Long URLs shrink to 23 in X’s count.
The counter says a reply is over, but X accepts it. The counter included the @mentions X adds automatically at the start of a reply, which X doesn’t count. Remove them and recount.
The count is a few higher than expected. Check for trailing spaces, extra blank lines at the end, or zero-width characters picked up when copying from a web page or a PDF. Paste the text into a plain-text editor first, then into the counter.
A domain in my sentence costs 23. twitter-text treats text like example.com as a link. Rephrase it (“example dot com”) or accept the cost.
Frequently asked questions
Does Twitter count spaces as characters?
Yes. Every space counts as 1, and each line break counts as 1. A blank line between two paragraphs costs 2.
Do links count as characters on Twitter?
Yes, but always as 23, whatever the real length. A long tracking URL and a short domain like x.ai both cost 23, and each additional link costs another 23.
How many characters does an emoji use on X?
Two. Since version 3 of X’s counting rules, every emoji counts as 2, including flags, skin-tone variants and combined emoji such as families.
Why do Chinese, Japanese and Korean posts fill up faster?
X gives CJK characters a weight of 2, so a post written only in those scripts fits about 140 characters. Latin, Cyrillic, Arabic, Hebrew, Devanagari and Thai characters count as 1.
Do attached images or videos count toward the limit?
No. Media you attach in X’s composer doesn’t use any characters. Only a pasted link to an image or video counts, as 23.
Does the counter check X Premium’s longer posts?
It counts the full weighted length of any text, but it compares it against the standard 280 limit. For a Premium long post, use it to make sure the opening that shows in the timeline works on its own.
Can I use it for my bio or display name?
It will count the characters, but it’s built for posts and only checks against 280. Profile fields have their own limits, such as 160 characters for a bio. See the Twitter character limit guide for every field, or the Twitter Bio Generator guide for writing one.
Does it count words?
No. X limits posts by weighted characters, not words, so the counter shows characters only.
Is my text saved anywhere?
No. The count runs in your browser with the twitter-text library. Your draft isn’t uploaded or stored.
Related guides and tools
- Twitter character limit: every limit on X, from standard and Premium posts to bios, display names and DMs.
- How to write a Twitter thread: what to do when one post isn’t enough.
- Twitter Font Generator guide: styled text and what it costs in characters.
- Fake Tweet Generator: preview how a post will look once the length is right.




