Logo

MonoCalc

/

Emoji Counter

Social Media

A pictograph followed by U+FE0E is currently counted as an emoji and labelled text presentation. Analysis runs entirely in this page — nothing you paste is sent anywhere.

The three lengths

Grapheme clusters

0

User-perceived characters, via Intl.Segmenter.

Code points

0

Unicode scalar values.

UTF-16 code units

0

What JavaScript's String.length returns.

One string, three different answers
👨‍👩‍👧‍👦 (family: man, woman, girl, boy) is 1 grapheme cluster, 7 code points and 11 UTF-16 code units. None of the three is more correct than the others, so this tool never presents one of them as the character count, and never derives the emoji count by subtracting one from another.

Grapheme ruler

These counts describe the string, not how it looks
The same sequence renders differently on different platforms and fonts — a sequence your device draws as one glyph may appear as separate components, or as a missing-glyph box, elsewhere. Counts are unaffected by any of that.

Paste some text above and every grapheme cluster appears here as its own box, sized by how many UTF-16 code units it costs.

Copy and export

Removing emoji drops whole grapheme clusters, so a joined sequence never leaves half of itself behind. CSV cells are quoted and any cell opening with =, +, -, @, a tab or a carriage return is prefixed with an apostrophe, so pasted text cannot become a spreadsheet formula.

Measuring text against a field length is the Social Media Character Limit Checker. Breaking text into a numbered series of posts is the Twitter Thread Splitter. This tool counts and explains; it does not do either of those.

About This Tool

Emoji Counter – Count Emoji, Graphemes, Code Points and UTF-16 Units

Paste any text into this emoji counter and it answers two questions exactly: how many emoji is that, and how long is the string really. Both answers are more slippery than they look, which is why most counters on the web disagree with each other about the same sentence. Everything here runs in your browser — nothing you paste is uploaded, stored or sent anywhere.

Why there are three lengths, not one

A string has at least three defensible lengths and they are routinely confused with each other:

  • Grapheme clusters — the characters a reader perceives, found with Intl.Segmenter at grapheme granularity.
  • Code points — Unicode scalar values, what Array.from(text).length returns.
  • UTF-16 code units — what JavaScript’s String.length reports, and what a great many length budgets are quietly built on.

The family emoji U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466 is 1 grapheme cluster, 7 code points and 11 UTF-16 code units. A counter that reports a single number has picked one of those three and not told you which. This tool always shows all three, always labelled, and never derives the emoji count by subtracting one from another.

How “is this an emoji?” is decided

Classification uses Unicode property escapes rather than a hardcoded list of code-point ranges, because a range list rots with every Unicode release. A cluster counts as an emoji cluster when it contains at least one \p{Extended_Pictographic} code point, or is a regional-indicator pair, or is a keycap sequence.

The trap that breaks most emoji counters
\p{Emoji} on its own is not a valid test. The ASCII digits 0–9, # and * all carry Emoji=Yes, so a counter built on that property reports a bare 7 as an emoji. A plain digit is plain text here, and there is a test for exactly that case.

What the breakdown tells you

Every grapheme cluster is labelled with its kind and its cost. A single pictograph such as U+2615 is one thing; a skin-tone sequence such as U+1F44D U+1F3FD is a modifier base plus a Fitzpatrick modifier, reported by type number. A ZWJ sequence lists its joined components, and because multi-person sequences carry a tone per person, skin tone is reported as a list rather than as one field. A flag is a pair of regional indicators, decoded to the ASCII letters it spells — with the important caveat that an odd trailing indicator is not half a flag but a dangling one, so 🇺🇸🇬 is two clusters and one flag.

Tag sequences produce the most surprising number in the tool. A subdivision flag is U+1F3F4 followed by one invisible tag character per letter of the subdivision code and a cancel tag to close the run. Every tag character lives above the BMP and therefore costs two UTF-16 units, so a single apparent glyph climbs to 14 UTF-16 code units across 7 code points.

The hearts problem, and other invisible differences

❤ is U+2764. ❤️ is U+2764 U+FE0F, with a variation selector requesting the colour glyph. On most screens they look identical, but they are 1 and 2 code points respectively, and many keyboards insert the second form without telling you. The same story runs through plain text: é as U+00E9 is one code point, while the decomposed e plus combining acute is two. Grapheme is not code point for ordinary letters either, not just for emoji.

Reading the ruler

The grapheme ruler draws one box per cluster, with each box’s width scaled to its UTF-16 cost, so an emoji-heavy line visibly sprawls next to a line of letters of the same apparent length. Clicking a box opens the code-point inspector, where every invisible code point — joiners, variation selectors, tag characters — appears as its own labelled chip. The stacked bar beneath answers “how much of this string is emoji?” in units rather than by eye.

Counts describe the string, not the picture
The same sequence renders differently on different platforms and fonts. A sequence your device draws as a single glyph may appear as separate components, or as a missing-glyph box, somewhere else. None of that changes the counts, and this tool makes no claim about how anything renders anywhere.

Emoji names come from a local dataset by exact sequence match. When a sequence is not in it, the tool says so rather than inventing a name — a wrong name is worse than no name.

Frequently Asked Questions

Is the Emoji Counter free?

Yes, Emoji Counter is totally free :)

Can I use the Emoji Counter offline?

Yes, you can install the webapp as PWA.

Is it safe to use Emoji Counter?

Yes, any data related to Emoji Counter only stored in your browser (if storage required). You can simply clear browser cache to clear all the stored data. We do not store any data on server.

Why does this tool show three different counts instead of one?

Because 'how long is this text' has three correct answers and they are rarely the same number. Grapheme clusters are the characters a reader perceives, code points are Unicode scalar values, and UTF-16 code units are what JavaScript's String.length returns. The family emoji 👨‍👩‍👧‍👦 is 1 grapheme cluster, 7 code points and 11 UTF-16 code units — one string, three honest answers. This tool always labels which number it is showing and never presents one of them as 'the' character count.

Why is a family emoji one emoji but seven code points?

It is four separate people emoji glued together by three invisible zero-width joiners (U+200D). Your device draws the whole run as a single picture, so a reader sees one character, but the string underneath still holds all seven code points. The breakdown panel lists every one of them, joiners included, so you can see exactly where the length went.

Why do ❤ and ❤️ count differently when they look the same?

They are different strings. ❤ is the single code point U+2764, while ❤️ is U+2764 followed by U+FE0F, the variation selector that asks for the colour emoji glyph. Both are one grapheme cluster, but the second is 2 code points and 2 UTF-16 units against the first's 1 and 1. Many keyboards insert the U+FE0F form silently, which is one of the most common reasons two counters disagree about the same-looking text.

Why is a single flag letter not counted as a flag?

A flag emoji is a pair of regional indicator symbols — 🇺🇸 is U+1F1FA followed by U+1F1F8. Unicode pairs indicators greedily from left to right, so 🇺🇸🇬 is a US flag followed by a leftover indicator, which is 2 grapheme clusters, not one and a half flags. The tool labels that leftover as a dangling regional indicator and keeps it out of the emoji count rather than quietly folding it into the flag before it.

Why does the 🏴 flag cost 14 UTF-16 code units?

Subdivision flags are tag sequences: a waving black flag U+1F3F4, then one invisible tag character per letter of the subdivision code, then a cancel tag U+E007F to end the run. England spells out gbeng, so the sequence is 7 code points. Every tag character sits above the BMP and therefore costs 2 UTF-16 units each, which is how one apparent glyph climbs to 14. It is the single most surprising number this tool reports.

Why does the same emoji look different on another device?

Because the picture is supplied by the font on the device doing the drawing, not by the string. The same sequence can appear as one glyph on your phone, as separate components on a desktop with an older emoji font, and as a missing-glyph box somewhere else. None of that changes the counts — this tool describes the string, and the string is identical everywhere.