Unicode Character Counter

One text, four honest counts: graphemes (what you see), code points, UTF-16 units (what JavaScript sees) and UTF-8 bytes (what the network sees), side by side.

Word goal
Live stats
0Words
0Characters
0Without spaces
0Sentences
0Paragraphs
0Unique words
0 secReading time
0 secSpeaking time
How counting works (spec v1)
  • Words are locale-aware word segments: punctuation and emoji are not words, numbers like 3.50 count as one, contractions (don't) count as one, hyphenated compounds (follow-up) count as two, and a URL or email address counts as one.
  • Characters are what you perceive: a family emoji, a flag or an accented letter counts as 1. Code points, UTF-16 units and bytes are in Detailed statistics.
  • Sentences use locale-aware boundaries with abbreviation handling, so Dr., e.g. and $3.50 do not split.
  • Paragraphs are blocks separated by a blank line. Line counts are in Detailed statistics.
  • Density uses the same words as the headline count, phrases never cross a sentence boundary, and filters change what is listed, never the percentages.

Reading time uses 238 words per minute, speaking time 130 words per minute.

Detailed statistics
Non-empty lines0 Total lines0 Code points0 UTF-16 units0 UTF-8 bytes0 Average word length0 Average sentence length0 words Longest word- Longest sentence0 words Pages (250 words each)0 Flesch reading ease*- Flesch-Kincaid grade*-

*English-language estimate. For a full report use the Readability Checker.

Platform checks
X post (weighted)0 / 280

X's own rules: every link counts as 23, emoji and CJK count as 2.

Instagram caption0 / 2,200

Hard limit 2,200 characters; only about the first 125 show before "more".

Google title guidance0 (50 to 60 typical)

Guidance, not a limit: Google truncates by pixel width per device. Check the SERP preview.

Google description guidance0 (120 to 160 typical)

No fixed limit exists; snippets are truncated to fit and often rewritten.

Keyword density checker

Density is each phrase's share of ALL words in the text (the same word count as the headline). Filters and the English stopword list only change which phrases are listed, never the percentages. Phrases never bridge two sentences.

Type or paste text above to see your top words and phrases.

Four counts, one string: a worked example

Take the string "cafΓ© πŸ‡ΊπŸ‡ΈπŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦". A human counts 7 characters: four letters, a space, a flag, a family. Graphemes: 7. Code points: 13, because the flag is two regional indicators and the family is seven joined code points. UTF-16 units: 17, since every emoji code point above the base plane costs a surrogate pair. UTF-8 bytes: 34. Every one of those numbers is correct for its own question: display width, Unicode processing, JavaScript string math, and storage cost respectively.

Bugs happen when layers disagree: a form validates 100 "characters" in JavaScript units, the database truncates at 100 bytes, and the user typed 60 emoji. Paste the failing text above, open Detailed statistics, and the mismatched layer identifies itself immediately.

Unicode counting FAQ

Grapheme, code point, code unit, byte: what is the difference?

A grapheme cluster is one user-perceived character: one family emoji, one flag, one accented letter. A code point is one Unicode number; a flag is two code points, a family emoji up to seven. UTF-16 code units are how JavaScript stores strings; code points above U+FFFF take two (a surrogate pair), so "😊".length is 2. UTF-8 bytes are what files and networks carry: ASCII is 1 byte, most European letters 2, CJK 3, emoji 4. This page shows all four so you can match any system's definition.

Why does "πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦".length equal 11 in JavaScript?

Because a family emoji is built from four person emoji joined by three invisible zero-width joiners. Each person is 2 UTF-16 units, each joiner is 1: four times two plus three is eleven. It is 7 code points, 25 UTF-8 bytes, and exactly 1 grapheme, which is what a human, and this page's headline count, calls it.

Which count do databases and forms enforce?

Almost never graphemes. VARCHAR(255) in modern MySQL counts code points; many validators count UTF-16 units; payload limits count UTF-8 bytes. When a form rejects text that "fits", compare its error against the UTF-16 and byte numbers in Detailed statistics; one of them will match the enforcement, and that tells you what to trim.

Why do UTF-8 bytes matter for the web?

Bytes are what users download. The same 160 visible characters cost 160 bytes in English, around 300 in Greek or Cyrillic, and around 480 in Chinese. SMS segmentation, HTTP header limits, URL length caps and database row sizes are all byte or unit budgets underneath, which is why a byte count belongs next to every character count.

Is the text analyzed locally?

Yes, entirely in your browser. Nothing is uploaded, and the draft autosave is a visible on-device toggle with a delete control.