Back to Blog

X (Twitter) Character Limit 2026: How Weighted Counting Actually Works

2026-07-02

X does not count characters one for one. This guide explains the weighted counting rules — which scripts cost 2, why every URL costs exactly 23 — and lists every field limit.

Every X character limit

X allows 280 characters per post on a free account and 25,000 on a Premium subscription. The Premium figure is less useful than it appears: only the first 280 characters render in the timeline, with the remainder collapsed behind a "Show more" link. For anything that must be read without an extra tap, 280 remains the number that matters.

FieldLimit
Post (free account)280 weighted characters
Post (X Premium)25,000 characters
Direct message10,000 characters
Bio160 characters
Display name50 characters
Username (@handle)15 characters
Location field30 characters
Poll option25 characters each
List name25 characters
List description100 characters
Image alt text1,000 characters

Weighted counting: the rule almost every guide gets wrong

X is the only major platform that does not count characters one for one. It uses a weighted system, published as part of the open-source twitter-text library, in which each character costs either 1 or 2 units depending on where it falls in Unicode. The 280 limit is a budget of weighted units, not of characters.

The rule itself is simple once stated precisely: characters in the Unicode range U+0000 to U+10FF cost 1 unit, and everything outside that range costs 2. What makes this widely misreported is that the range is far broader than "English" or even "Latin".

ScriptCost per character
Latin (English, French, Vietnamese…)1
Greek1
Cyrillic (Russian, Ukrainian…)1
Hebrew1
Arabic1
Thai1
Devanagari (Hindi, Marathi…)1
Japanese (kana and kanji)2
Chinese2
Korean (hangul)2
Emoji2

The common claim that "non-English characters count as two" is therefore wrong. Arabic, Hebrew, Thai, Hindi, Russian and Greek all count as one, exactly like English. The characters that cost two are, in practice, CJK scripts and emoji.

What this means if you write in Japanese, Chinese or Korean

Because each CJK character costs two units, the effective allowance is 140 characters rather than 280. This is the single most consequential fact about posting on X in these languages, and it is why a Japanese post that fits on Threads will often not fit on X.

LanguageWeighted limitCharacters you can actually type
English280280
Russian280280
Arabic280280
Japanese280140
Chinese280140
Korean280140

Mixed-script posts are charged proportionally. A post combining 100 Latin characters with 50 Japanese characters costs 100 + 100 = 200 units, leaving 80 units — that is, 80 more Latin characters or 40 more Japanese ones.

Why every URL costs exactly 23

X automatically rewrites every link through its t.co shortener, and charges a fixed 23 units for it regardless of the original length. This applies whether the URL is 15 characters or 300, and it applies even though the full link is what appears in the rendered post.

  • A 12-character link such as example.com still costs 23 units — shortening it makes the post longer, not shorter.
  • A 250-character URL with tracking parameters also costs 23, so there is no reason to strip parameters for length reasons on X specifically.
  • Using a third-party shortener before posting wastes effort and can reduce trust, since the visible domain becomes the shortener's rather than yours.
  • This behaviour is unique to X. Threads, Instagram, LinkedIn and TikTok all charge the literal length of the URL.

The practical rule is to paste long links directly into X and to shorten them everywhere else. Applying the same habit across platforms is the most common source of miscounted drafts.

What does not count

  • Attached images, GIFs and video consume no characters. Up to four images may be attached to a post.
  • Quoted posts do not add the quoted text to your own count.
  • In replies, leading @mentions of the accounts being replied to are excluded from the 280.
  • Alt text has its own separate 1,000-character budget and never affects the post itself.

Mentions typed inside the body of a post, as opposed to the automatic ones at the start of a reply, are counted at their literal length like any other text.

Counting a draft accurately

A plain character counter will misreport any X post containing a link, an emoji or CJK text, sometimes by a wide margin — a draft that appears to be 250 characters can be well over the limit once weighting and the 23-unit URL cost are applied.

PostLen implements the weighted rules and the fixed URL cost, so the number shown is the number X will use. It counts the same draft against Threads, Instagram, LinkedIn, YouTube, TikTok and meta descriptions at the same time, which makes the differences between platforms visible while you are still writing.

Frequently asked questions

What is the X (Twitter) character limit?

280 weighted units on a free account and 25,000 for X Premium subscribers. Only the first 280 characters are visible in the timeline before a "Show more" link, regardless of tier.

How many Japanese characters fit in an X post?

About 140. Japanese, Chinese and Korean characters each cost two weighted units against the 280 budget.

Do all non-English characters count as two on X?

No — this is a widespread misconception. Only characters above U+10FF cost two, which in practice means CJK scripts and emoji. Arabic, Hebrew, Thai, Hindi, Russian and Greek all count as one, the same as English.

How many characters does a link use on X?

Exactly 23, whatever its actual length, because X routes every link through its t.co shortener. Shortening a URL before posting therefore saves nothing on X.

Do images count toward the character limit?

No. Up to four images, or one GIF or video, can be attached without using any of the 280 units.

Does X Premium really allow 25,000 characters?

Yes, but only the first 280 appear in the timeline before the post is collapsed behind "Show more", so the opening 280 still determine whether anyone reads the rest.

PostLen counts your draft against every platform in this article at the same time.

Try PostLen →