Skip to content
OmniTools

Social Media Character Counter

Count a post the way each platform counts it: X link weight, grapheme clusters for Instagram, UTF-16 for TikTok, GSM-7 SMS segments.

All text tools

Social media character counter

Paste a caption, post, title or message. Every platform below is measured the way that platform actually measures it, because “280 characters” is not one number: X charges a fixed 23 for a link, Instagram counts what a person would call one character, and LinkedIn counts emoji twice. Nothing is uploaded.

Platform limits, measured the way each platform measures them

X (Twitter) · Post (tweet)153 / 280
counted in code points127 left

Measured in code points, but every link is rewritten to a t.co URL and charged a flat 23 characters however long it is. That is why a 90-character URL still leaves you 190 characters.

Instagram · Caption188 / 2,200
counted in grapheme clusters2,012 left

Past the ~125-character fold point, so the rest is behind "see more".

Counted in grapheme clusters, so one flag, one keycap sequence or one family emoji is one character. The caption is collapsed after 125 characters, which is also where a new line no longer shows up as a gap.

LinkedIn · Post205 / 3,000
counted in utf-16 code units2,795 left

5 before the ~210-character fold point.

Counted in UTF-16 code units, so an emoji costs two. The "see more" cut-off is about 140 characters on the mobile app and about 210 on desktop, and it moves with the size of your text block.

Facebook · Post / status205 / 63,206
counted in utf-16 code units63,001 left

272 before the ~477-character fold point.

Counted in UTF-16 code units. The feed collapses around 477 characters; the hard limit is high enough that you will hit the fold point long before the ceiling.

YouTube · Video title196 / 100
counted in code points96 over

Past the ~70-character fold point, so the rest is behind "see more".

Counted in code points. Google cuts the tail of a long title off in the search results and on the video card at roughly 70 characters, and because that is a pixel-width cut-off the exact letter that disappears depends on the font size.

YouTube · Video description196 / 5,000
counted in code points4,804 left

Counted in code points. Everything past the first 100 or so characters is behind "show more" on the video page, but the whole description is still indexed.

TikTok · Caption205 / 2,200
counted in utf-16 code units1,995 left

Counted in UTF-16 code units. Some sources and older in-app screens say 4000; TikTok has never published a single authoritative figure, so 2200 is the widely reported current ceiling.

Bluesky · Post (grapheme limit)188 / 300
counted in grapheme clusters112 left

One of two caps applied to the same post: 300 grapheme clusters, counted so an emoji sequence is one cluster.

Bluesky · Post (UTF-8 byte limit)229 / 3,000
counted in utf-8 bytes2,771 left

The second cap on the same post: 3000 bytes of UTF-8. A post of 300 emoji can pass the grapheme limit and still be rejected on bytes, because each emoji costs about four bytes.

Threads · Post188 / 500
counted in grapheme clusters312 left

Counted in grapheme clusters. Premium accounts are allowed more, but 500 is the standard allowance.

WhatsApp · Message205 / 65,536
counted in utf-16 code units65,331 left

Counted in UTF-16 code units, which is about 32,000 emoji. Pasting a longer document into the composer is refused rather than truncated.

How each method counts your text

Code points196
Grapheme clusters188
UTF-16 code units205
UTF-8 bytes229
X units (links charged 23 each)153

Links found in your text

  • https://example.com/omni-tools/releases/2026-04-17-notes-and-fixes66 characters as written, charged as 23 by X. Without that rule this post would be 196 code points long.

Characters in your text that are more than one thing at once

  • 👨‍👩‍👧‍👦1 grapheme · 7 code points · 11 UTF-16 units · 25 bytes
  • 🇮🇳1 grapheme · 2 code points · 4 UTF-16 units · 8 bytes
  • 👋🏽1 grapheme · 2 code points · 4 UTF-16 units · 8 bytes

A grapheme cluster is what a person reads as one character. A skin-tone modifier makes one, a zero-width joiner glues a whole family into one, and a flag is a pair of regional indicators that has to be counted as one or it looks like two letters. The same cluster can be one character to Instagram and four to a byte limit.

Code points
Unicode characters, counted one per letter or symbol. An emoji built from a modifier or a joiner is several of these, so this method punishes emoji hardest.
Grapheme clusters
What a person would call one character. A flag, a keycap or a multi-person emoji is one cluster, which is why this is the fairest way to measure what will be read.
UTF-16 code units
JavaScript string length. Every emoji outside the basic plane takes two units, so a 100-emoji caption is 200 here. This is what most app backends measure.
UTF-8 bytes
The stored size of the text. One letter costs one byte and a typical emoji costs three or four, so this is the only method that reflects a real byte ceiling.

There is no single correct character count. A method is only right relative to the platform that uses it, which is why the same sentence can be under a limit on Instagram and over it on LinkedIn.

SMS segments

Every character is in the GSM-7 alphabetNo
Encoding this message would useUCS-2
Segments4
Characters per segment67
Room left in the last segment63
Messages billed4

This message contains characters outside GSM-7, so the whole message has to be sent as UCS-2 and one segment carries only 67. At 4 segments it is billed as 4 messages.

Characters forcing UCS-2

  • 🚀
  • 👨
  • ‍
  • 👩
  • 👧
  • 👦
  • 🇮
  • 🇳
  • 👋
  • 🏽

A £ or an accented letter such as é is in GSM-7 and costs nothing extra. An emoji, a rupee sign, a curly quote or a non-Latin script character is not, and it is the presence of one of these that makes the whole message UCS-2.

SMS is the odd one out: it does not count characters, it counts segments, and each extra segment is billed again. A single space, a full stop or one emoji can move a whole message from one segment to two.

Estimated pixel width

Whole text at 20px2191 px
Against the ~600px search-result cut-off1591px over
First line only, as a title (20px)287 px

Wide letters are priced at about 1.0em, narrow ones such as i, l, ! and a full stop at about 0.5em, and everything else at about 0.55em. That is why YouTube’s ~70-character fold point is only an average: the real cut-off falls wherever the width lands.

Google truncates search result titles by pixel width, not by character count, so a 70-character title of narrow letters survives and a 70-character title of wide ones does not. The width below is an estimate from letter shapes, not a measurement in a real font.

Platform limits change without notice, and several of them are enforced by the app rather than published by the platform. The figures here are the documented or widely-reported values as of April 2026, and the fold points are community consensus, which is approximate by nature and moves with font size, screen and account type.

This tool runs entirely in your browser. Nothing you enter is uploaded, stored, or logged.

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.

  1. "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
  2. 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
  3. The same URL counted raw is 75 characters, which is where a naive counter overstates the cost by 33
  4. 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
  5. 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.