What this tool does
"280 characters" is not one measurement, it is at least four, and the difference is where posts get rejected. A link on X costs 23 characters however long it is, a family emoji costs Instagram one character and TikTok two, and an SMS in Hindi is billed at 70 characters per segment instead of 160 because none of its letters fit the GSM-7 alphabet. This tool runs all four counting methods over the same text and shows every limit side by side, with the reasoning for each one attached.
How it works
X counts code points and rewrites every link to a t.co URL priced at a flat 23 characters. A 56-character changelog link is therefore charged 23, which is why a post containing it comes out at 42 of the 280 available rather than the 75 a raw count suggests. Instagram and Threads count grapheme clusters through the browser's own Intl.Segmenter, so a flag, a keycap sequence and a four-person family emoji are each one character however many code points they are built from. Bluesky appears twice for exactly that reason: 300 grapheme clusters and a separate 3,000-byte UTF-8 ceiling applied to the same post, so 300 family emoji pass the cluster limit and fail on bytes at 7,500. TikTok, LinkedIn, Facebook and WhatsApp count UTF-16 code units, which is what an application backend measures, and where that single family emoji costs eleven.
The fold points are the numbers most counter pages get wrong, so they are labelled as estimates rather than constants. LinkedIn collapses a post at roughly 140 characters on mobile and 210 on desktop, and five separate counter sites will quote you 125, 140, 210, 477 or 1,300 for the same field. Instagram collapses at 125, Facebook's feed at about 477, and YouTube truncates a title at around 70 characters — a pixel-width cut-off, not a character count, so which letter survives depends on the font size. A rough em-width estimate is included for that reason: seventy narrow characters and seventy wide ones are very different lengths on screen.
SMS is handled separately, and deliberately not as another limit card. An SMS is billed by segment, not by character, and the segment size depends on whether every character in the message exists in the 65-character GSM-7 alphabet. An all-ASCII message fits 160 characters in one segment and 153 in each one after that, so the 161st character is the single most expensive character you can send. One character outside the alphabet — a rupee sign, a curly apostrophe, or any Devanagari letter — drops the whole message to UCS-2, where the limits become 70 and 67. A counter that showed a flat "160" for an SMS would call a perfectly legal 300-character Hindi message over the limit, which is worse than showing nothing. The panel instead reports the encoding, the segment count, the characters used in the final segment and exactly which characters forced the switch.
Every count is shown for all four methods at once rather than only the one the platform happens to use, because a caption with several emoji is exactly the case where the methods disagree most. A line reading "Great work, team" plus a family emoji and an Indian flag is 27 code points, 20 grapheme clusters, 33 UTF-16 units and 51 UTF-8 bytes — one sentence, four different answers, and only one of them is what Instagram will count. Nothing is sent anywhere: the segmentation and the counting both run in the tab.
Worked example
A launch post containing two emoji, a changelog link and an OTP message, where each platform's limit has to be respected before publishing.
- "Great work, team" plus a family emoji and an Indian flag measures 27 code points, 20 grapheme clusters, 33 UTF-16 units and 51 UTF-8 bytes
- Added "See the changelog: " and a 56-character URL: X charges the link at 23, so the post reads 42 of 280 and 238 characters remain
- The same URL counted raw is 75 characters, which is where a naive counter overstates the cost by 33
- OTP in English (48 characters) is one GSM-7 segment with 112 to spare; the same message in Devanagari is 38 units, 16 of them outside the alphabet, so it is UCS-2 at 70 per segment
- A 161st ASCII character would push the English SMS from one segment to two, dropping the per-segment size from 160 to 153
One post, four different lengths, and two SMS encodings — the post fits everywhere, and the English OTP still fits in one segment while the Hindi one needs checking against the shorter 70-character limit.
Accuracy and limitations
- Limits and fold points change without notice, and TikTok has never published a single authoritative caption ceiling; 2,200 is the widely reported figure, not a documented one. Every number here carries the counting method it is measured in so you can check it rather than trust it.
- The em-width figure is an estimate for reasoning about search-result truncation, not a measurement. Real widths depend on the font, size, weight and letter-spacing, and no font metrics are available in a browser tab.
- The 100,000-change style caps do not apply here, but a very large paste is still processed in memory. This is a counting tool, not a document store, and it is not the place to paste a 20,000-line file.
Frequently asked questions
- Why does my X post show fewer characters than I typed?
- Because X rewrites every link to a t.co URL and charges it a flat 23 characters however long the original was. A 56-character link counts as 23, which is why a post that reads as 75 characters of text reports as 42 in the composer. The counter applies that discount, and shows you the remaining budget on all 280.
- How many characters is an emoji on Instagram?
- One, because Instagram counts grapheme clusters rather than code points. A family emoji is four people joined by zero-width joiners, and a flag is a pair of regional indicators, but each counts as a single character here. The same emoji is 2 units on LinkedIn, 11 on TikTok and 25 bytes on Bluesky, which is why the four counts are shown side by side rather than one number pretending to be universal.
- How many characters fit in one SMS?
- 160 if every character is in the GSM-7 alphabet, and 70 if any character is not. One character outside that alphabet switches the whole message to UCS-2 and more than halves the budget, which is what happens to any Devanagari, Tamil or Telugu text, to a rupee sign, or to a curly apostrophe. The panel reports the encoding, the number of segments and which characters forced the switch.
- Why do Bluesky and Instagram count differently on the same post?
- They measure different things. Instagram counts 2,200 grapheme clusters, so 300 family emoji would be 300 characters and fit. Bluesky applies a 300-grapheme limit and a separate 3,000-byte UTF-8 limit to the same post, and 300 family emoji come to 7,500 bytes, so that post passes the cluster limit and is still rejected. The Bluesky row appears twice in the table for exactly this reason.
- Is the LinkedIn 3,000 character limit the whole story?
- No, and this is the number counter pages most often quote wrong. Your post is cut off behind a "see more" at roughly 140 characters in the mobile app and roughly 210 on desktop, and that cut-off moves with the size of the text block. The 3,000 is only the hard ceiling you will hit long after the feed has already hidden your second line.
- Does a pasted emoji count differently from a typed one?
- Not to these counters, and that is the point. They measure the string, not the keystrokes, so an emoji pasted from another app is counted by exactly the same rules as one you chose from a picker. What does change the count is which platform you are posting to, because four different systems measure the same string in four different units.