Character Counter
Characters as a human counts them and as a computer stores them, against each platform limit.
Updated
Nothing is uploaded; the counting happens in your browser.
Your text
149characters
121 without spaces
131 characters remaining. Links count as 23 characters no matter their real length.
- Characters (what you see)
- 149
- Unicode code points
- 149
- UTF-16 code units
- 150
- UTF-8 bytes
- 152
These four numbers disagree because your text contains characters outside the basic range (emoji, accents, or a non-Latin script). A person counts one emoji as one character; a database column counts its bytes, and an SMS gateway counts its code units. That gap is why a post which looks short can still be rejected as too long.
In short
Why does one emoji count as more than one character?
Because three counts disagree. A four-person family emoji is 1 character to a human eye, 7 Unicode code points, 11 UTF-16 code units, and 25 UTF-8 bytes. Paste 26 of them into a 280-character box and a code-unit counter reads 286 and rejects the post, while the count you did in your head says 26.
The grapheme count is the one a person agrees with, but not every platform counts that way, so read the count your destination uses rather than the one that looks correct.
How to use the character counter
Paste or type into the box and four separate counts appear at once: graphemes, code points, UTF-16 code units, and UTF-8 bytes, plus the same text with all whitespace stripped out. On plain English text all four agree, and the tool is dull in exactly the way you want.
The moment an emoji, an accented letter, a non-Latin script, or a combining mark enters the string the counts split apart, and that split is the reason this tool exists. The sample string it opens with is a case in point: 149 graphemes, 149 code points, 150 code units, and 152 bytes, all describing the same one sentence with a single emoji at the end of it.
The count you care about depends entirely on who is counting. A grapheme is what Unicode Standard Annex 29 calls an extended grapheme cluster, and it is the closest formal definition of what an ordinary person means by one character. A code point is one entry in the Unicode catalogue.
A UTF-16 code unit is a storage slot in the encoding that JavaScript, Java, and Windows use internally, which is why an astral character costs two of them and why a plain call to string length in a browser reports an emoji as 2.
A UTF-8 byte is what actually travels down the wire or sits in a database column. A family emoji reads as 1, 7, 11, and 25 on those four scales respectively, and none of those numbers is wrong.
1
Grapheme
the family emoji you see
7
Code points
entries in the Unicode catalogue
11
UTF-16 code units
what a length call reports
25
UTF-8 bytes
what travels down the wire
Nothing you paste leaves your browser. The counting runs in the page itself: no upload, no server round trip, nothing stored between visits, and the text is never written into the page URL, so there is no shareable link quietly carrying your draft around.
That matters when the string is an unpublished headline, a client message, a password hint, or a paragraph from a document you are not free to share. The platform selector is only a display choice, not a filter, so switching between the SEO title limit and the X limit changes the progress reading and the accompanying note while the four underlying counts stay exactly where they were.
Do
- Read the grapheme count when the question is how long the text looks.
- Count bytes when the constraint is a database column or an SMS segment.
- Paste the finished string, since trailing spaces are part of what a limit measures.
- Check the platform documentation before anything expensive depends on a limit.
Don't
- Assume the four counts still agree once an emoji enters the string.
- Trust a plain length call, which reports one family emoji as 11.
- Add an emoji to a 155-character text message without expecting extra segments.
- Read the platform selector as a filter, since it only changes the progress reading.
Working to a word limit instead?
Essays, briefs and application forms are usually capped in words. The word counter reports words, sentences and paragraphs, and estimates how long the piece takes to read.
Open the word counter →The same short strings measured four ways. Graphemes are what you see, code points are Unicode entries, code units are the UTF-16 slots JavaScript counts by default, and bytes are what UTF-8 stores. Every row where the columns disagree is a row where a character limit can behave in a way that looks like a bug.
| Text | Graphemes (what you see) | Code points | UTF-16 code units | UTF-8 bytes |
|---|---|---|---|---|
| Plain ASCII: hello world | 11 | 11 | 11 | 11 |
| Three Latin letters: abc | 3 | 3 | 3 | 3 |
| Euro currency sign | 1 | 1 | 1 | 3 |
| cafe with a precomposed e-acute | 4 | 4 | 4 | 5 |
| cafe written as e plus a combining acute accent | 4 | 5 | 5 | 6 |
| Japanese greeting, five kana | 5 | 5 | 5 | 15 |
| Arabic greeting, five letters | 5 | 5 | 5 | 10 |
| Grinning face emoji | 1 | 1 | 2 | 4 |
| Regional-indicator flag, two letters | 1 | 2 | 4 | 8 |
| Thumbs up with a skin-tone modifier | 1 | 2 | 4 | 8 |
| Keycap digit one | 1 | 3 | 3 | 7 |
| Rainbow flag, a ZWJ sequence | 1 | 4 | 6 | 14 |
| Woman scientist, a ZWJ sequence | 1 | 3 | 5 | 11 |
| Couple with heart, a ZWJ sequence | 1 | 6 | 8 | 20 |
| Family of four, a ZWJ sequence | 1 | 7 | 11 | 25 |
| Devanagari cluster, consonant plus virama plus consonant plus vowel sign | 1 | 4 | 4 | 12 |
| Twenty-six family emoji in a row | 26 | 182 | 286 | 650 |
| The sample sentence this tool opens with | 149 | 149 | 150 | 152 |
Why does a post that should fit get rejected?
That spread is why a post that should have fitted gets rejected. Take twenty-six family emoji: you counted twenty-six characters, and you are right by any human measure, but the same string is 286 UTF-16 code units.
A form that validates on storage length sees 286 against a limit of 280 and refuses it, with an error message that will tell you it is 6 over and never tell you why, because nothing in the visible text looks any longer than the twenty-six symbols you can point at.
The formula, worked line by line
There is no arithmetic here, which is the point: the difficulty is not calculating a count but deciding which count to report. This tool reports four, side by side, because the four are genuinely different questions and every one of them is the right answer somewhere.
Each comes from a different mechanism. The grapheme count uses the segmenter built into the browser, which applies the extended grapheme cluster rules of Unicode Standard Annex 29. The code-point count walks the string one Unicode scalar at a time. The code-unit count is the raw length property, the number most code reports without thinking. The byte count encodes the string as UTF-8 and measures the result.
graphemes = Intl.Segmenter(locale, { granularity: "grapheme" })
code points = [...text].length
code units = text.length (UTF-16, what JavaScript reports)
bytes (UTF-8) = TextEncoder().encode(text).length
no spaces = code points, with all whitespace removed- People in the sequence
- 4 astral emoji, 2 code units each
- Zero-width joiners
- 3, one code unit each
- Code points
- 4 + 3 = 7
- UTF-16 code units
- 8 + 3 = 11
- What you see
- 1 character
In UTF-8 it is 25 bytes, because each astral emoji encodes to 4 bytes and each joiner to 3. Repeat it twenty-six times and the four counts read 26, 182, 286, and 650: the gap between 26 and 286 is an entire order of magnitude, and the difference between a post that publishes and a post that does not.
The platform limits offered on this page are current as of July 2026. Platforms change these, so treat them as a starting point rather than a permanent fact and verify against the platform documentation before anything expensive depends on one; the notes attached to each limit below describe what actually happens at the edge, which is often softer than a hard refusal.
- SEO title tag: 60 characters, where Google truncates on pixel width near that mark rather than on a hard count.
- Meta description: 155 characters, which Google rewrites more often than not but which remains the safe span.
- X post: 280 characters, where a link counts as 23 characters no matter how long it really is.
- SMS on the GSM 7-bit alphabet: 160 characters, where a single character outside that alphabet drops the whole message to the Unicode ceiling.
- SMS in Unicode: 70 characters, which any emoji or non-Latin character puts you into.
- Instagram caption: 2,200 characters, of which only about the first 125 show before the more link.
- LinkedIn post: 3,000 characters, truncated at roughly 210 in the feed.
- YouTube title: 100 characters, cut around 70 in search results.
- Facebook post: 63,206 characters, where engagement falls off long before the ceiling.
Two practical rules follow. First, when a form rejects text that you counted as fitting, look at the code-unit column: the culprit is almost always an emoji, a flag, or a skin-tone modifier, and removing one can buy back several units at once.
Second, when the constraint is storage rather than display, count bytes. A database column declared to hold 20 characters in a byte-measured encoding holds five Japanese kana comfortably at 15 bytes but chokes on a single family emoji at 25. The same applies to filenames, HTTP headers, and anything with a documented byte budget.
Choosing the wrong count is not a small error at the margin; on emoji-heavy text the counts differ by more than ten to one.
Questions people ask
Sources
Where the constants and formulas on this page come from. Each line names the figure it backs.
The extended grapheme cluster rules behind the grapheme count — the formal definition of what an ordinary reader perceives as one character.
UAX #29: Unicode Text Segmentation — Unicode Consortium
The 280-character post limit and the rule that a link counts as 23 characters regardless of its real length.
Counting Characters — X (formerly Twitter), 2026
Related guides
Putting JSON in a URL: Validate, Minify, Percent-Encode, or Base64url?
A decision guide for flattening, encoding, checking, and safely transporting JSON in a query string.
August 11, 2026 · 9 min read
How Many Grams in a Cup? Every Ingredient, One Chart
One formula, fourteen densities. Why flour is 120 g, honey is 340 g, and the ingredient — not the cup — decides the number.
August 10, 2026 · 14 min read
How Are Loan Payments Calculated? Amortization, Explained
One level payment, front-loaded interest — the formula worked by hand, the two levers you control, and why the smaller payment is often the costlier loan.
July 23, 2026 · 13 min read