Character Limit Checker

Paste once and see every platform limit your text passes and every one it breaks, with the exact point each one cuts at. Nothing is uploaded and nothing is stored.

Try one:

What is in the box

Three different numbers, on purpose. Platforms disagree about what one character is, so a single count would be wrong somewhere. Why they disagree.

As a text message

An SMS is not measured in characters but in septets or code units, and the encoding is chosen by the content. One character outside the GSM-7 table drops the whole message to UCS-2 and cuts the per message allowance from 160 to 70.

Every limit, side by side

Type something above and this table fills in.

Platform and field Limit Yours Verdict Where it cuts

Platform limits change without notice and some are enforced differently by the app, the web client and the API. Every number in this table is sourced below with a link to where it is published. Treat the table as a check before you paste, not as a guarantee about what a given client will accept today.

Why the same text gets three different numbers

Ask five platforms how long 👨‍👩‍👧‍👦 is and you get five answers. It is one thing you can put a cursor either side of, eleven UTF-16 code units, twenty five UTF-8 bytes, and on X it costs two. None of those is a mistake. They are answers to different questions, and the platform you are about to paste into has already picked one of them without telling you.

This page shows all three counts at once and then, for each platform, uses that platform's unit to decide whether you are over. That is the whole point of the table above: a general character counter tells you a number, and you still have to know which number the platform wanted.

Read the full explanation: graphemes, code units, bytes, GSM-7 and the X weighting rule

Graphemes: what a reader would call one character

A grapheme cluster is one user perceived character. The family emoji is a grapheme cluster built out of four separate emoji glued together with zero width joiners, and a flag is two regional indicator letters that a font draws as one image. Korean, Thai and Devanagari all put marks together the same way. This page counts graphemes with Intl.Segmenter, which is the browser's own implementation of the Unicode text segmentation rules, so the count matches where your cursor stops when you press the arrow key.

UTF-16 code units: what most limits are actually counting

Most web software is written in a language whose string length is a count of UTF-16 code units, so when a platform says 2,200 characters what it usually enforces is 2,200 code units. Anything outside the Basic Multilingual Plane, which is nearly every emoji, is two code units rather than one. That is why a caption that looks well under the limit can be rejected once you add emoji: each one quietly costs double. Where we know a platform counts differently, the table says so on that row.

UTF-8 bytes: what it costs to store and send

Byte length is the one that matters for databases, URLs, file formats and any limit written in bytes. ASCII is one byte per character, Latin letters with accents and Greek and Cyrillic are two, Korean, Japanese and Chinese are three, and most emoji are four. A 100 byte column holds 100 English letters or 33 Korean ones.

SMS: GSM-7 against UCS-2

An SMS is not stored as characters. In the default alphabet defined by 3GPP TS 23.038 each character is packed into seven bits, which is where the famous 160 comes from: 140 bytes of payload divided by seven bits gives 160 septets. Ten characters cost two septets each because they are not in the basic table and have to be sent after an escape: ^ { } \ [ ~ ] | and the euro sign, plus the form feed control.

One character that is in neither table forces the whole message into UCS-2, and the allowance falls from 160 to 70. That includes every Korean, Japanese and Chinese character, every emoji, curly quotation marks and en and em dashes. Curly quotes are the usual culprit, because a word processor inserts them silently.

Longer messages are split and sent as parts. The concatenation header takes room out of every part, so the per part allowance drops to 153 septets or 67 code units. This page never splits an escape pair or a surrogate pair across a part boundary, which is why a part can end with a spare slot.

X: weighted characters, not characters

X does not count characters. It assigns a weight to each character and allows a total of 280 at a scale of 100. The default weight is 200, and only four ranges of code points weigh 100. In practice that means Latin, Cyrillic, Greek and general punctuation cost one, and everything else, including Korean, Japanese, Chinese, Arabic and Hebrew, costs two. So a post can be 280 English characters or 140 Korean ones. Emoji are parsed as single units at the default weight, so the family emoji costs two rather than eleven.

Links are a separate rule. Every link is replaced by a t.co link of a fixed length before counting, so a link costs the same 23 whether it is 20 characters or 200. Shortening a URL before you post it buys you nothing on X. The link detection on this page is deliberately simpler than the one X uses, so a bare domain without a scheme or a www. prefix is counted as ordinary text here and would be counted as a link there.

What we do with the cut point

When you are over a limit, the last column shows the text on both sides of the cut: the tail of what survives, then a scissor mark, then the beginning of what is lost. The cut is computed in the unit that platform counts in, and it never lands in the middle of a grapheme cluster, so an emoji is either wholly in or wholly out. Real clients differ in whether they refuse the paste, truncate it or add an ellipsis, and search engines rewrite titles rather than truncating them, so read the mark as this is where you run out of room rather than as a prediction of the rendered output.

What it costs and what it keeps

Free, no sign up, and your text never leaves your browser. There is no server side of this tool at all: the page has no upload endpoint to send anything to. There is also deliberately no share link, because putting a draft in a URL leaves it in browser history, in the clipboard and in whatever chat you pasted the link into. Nothing you type is stored anywhere, including here, so reloading the page starts you with an empty box.

Where each number comes from

Every limit above is listed here with the page that publishes it and how good that page is. A number we could not find published anywhere is not in this tool, which is why there is no Instagram alt text row, no LinkedIn headline row and no Facebook post row: in each case the platform states nothing and the third party guides contradict each other. Two rows are marked as guidance rather than limits, because Google says in as many words that they are not limits.

Platform and field Limit Counted in Source

Built by

This page is one of a small set of single purpose tools that run entirely in the browser with no account and no server side storage. One of them counts the days to any date with the counting rule made explicit, one converts a grade point average from a 4.5 or 4.3 scale to the US 4.0 scale, one works out an ETS date and the last duty day in front of it, and one checks which AI crawlers a robots.txt file currently lets in.