Word / Character Counter
Live word, character, sentence and byte counts with platform limit meters — entirely on this device.
- Words
- 0
- Characters
- 0
- Characters (no spaces)
- 0
- Graphemes
- 0
- Sentences
- 0
- Paragraphs
- 0
- Lines
- 0
- UTF-8 bytes
- 0
- Reading time
- ~0 s
- Speaking time
- ~0 s
Press ? for shortcuts
Do it offline:$ wc -w -l -m file.txt
How to use it
- Paste or type; the stat panel refreshes as you pause.
- Read the counts: words, chars with and without spaces, graphemes, sentences, paragraphs, lines and UTF-8 bytes.
- Check the four platform meters, each measured by its platform's own arithmetic.
- Copy stats takes the panel as text; drop a .txt or .md file to count it.
Type or paste and watch every measure update: words, characters with and without spaces, graphemes, sentences, paragraphs, lines and UTF-8 bytes, plus reading and speaking time. Four meters track platform limits — X posts, Instagram captions, meta descriptions and SMS segments — each in that platform's own unit. Boundaries come from Unicode segmentation, so Japanese, Chinese and Thai text counts correctly, and your text never leaves this tab.
How it works
Words, sentences and graphemes come from the segmenter built into the browser, applying the Unicode UAX #29 boundary rules — the machinery behind double-click selection. A segment counts only when word-like, so punctuation never pads the total. The rare browser without Intl.Segmenter gets a regex fallback and a notice; its word and sentence counts are approximate for CJK text.
chars is UTF-16 code units, the number String.length reports; graphemes are what a reader sees; UTF-8 bytes are the text's weight in a file. Lines are separators plus one — word followed by a newline is two lines, because the trailing newline opens an empty final line — yet one paragraph, since paragraphs are blank-line-separated runs.
The SMS meter shows the septet arithmetic: 160 GSM-7 characters fit one message, the 161st spills into two segments of 153, a € costs two septets, and one emoji flips the text to UCS-2, where 70 units fill a segment. Reading time divides words by 200 words a minute; speaking time uses 130.
Examples
Hello world. This is a test.6 words · 2 sentences · 28 chars · 23 without spacesBoth terminators close a sentence and every space is a character — 28 chars with spaces, 23 without.
Every publishing channel measures text differently, and the differences matter more than most writers expect. An email subject line is judged in characters, a search snippet in characters approximating pixels, a headline in column width, a text message in septets, and a blog post in words. Before a draft ships anywhere, someone has to answer the same question: how long is this, by the rule that the destination actually applies?
Word counts look like the simplest of these measures, yet two editors rarely agree. One program treats a hyphenated compound as a single word, another as two. Contractions, numerals and dates all land differently depending on the rule the software follows. The only stable approach is to name the rule: this page counts words the way Unicode defines them, so the number is reproducible anywhere that standard is implemented.
Character counts hide their own surprises. An accented letter can be stored as one code point or as a base letter plus a combining mark, and an emoji can occupy eleven units of storage while reading as a single symbol. When a platform enforces a limit, it enforces it in its own unit, which is why the same sentence can pass one limit and fail another without changing at all.
Reading time is the friendliest number here and the least precise. Divide the word count by an average pace of two hundred words per minute and you get a useful estimate, not a promise. Real readers skim, stall, and often reread whole paragraphs twice. Treat the estimate as a way to compare drafts against each other, not as a stopwatch, and it will serve you well.275 words · reading time ~1 min 23 s · speaking time ~2 min 7 s275 words at 200 wpm is 82.5 seconds, rounded to 83 and shown as ~1 min 23 s; the 130 wpm speaking pace gives 127 seconds, ~2 min 7 s.
👩👩👧👦1 grapheme · 11 UTF-16 code units · 25 UTF-8 bytesFour person emoji glued by three zero-width joiners: one symbol to a reader, eleven code units, twenty-five bytes. Joiners inside an emoji are never flagged.
Read the changelog: https://example.com/releases/2026-08-03#notes and reply with feedback.X post: 68 / 280 weighted units · 1 URL counted as 23 · 212 leftThe 45-character link costs a flat 23 units — X rewrites every URL to a fixed-length t.co address — so 90 characters spend only 68.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
Japanese and Thai words have no spaces to count
Whitespace splitting fails here; boundaries come from the browser's dictionary-informed segmenter: 今日は良い天気です is 5 words, สวัสดีตอนเช้า is 3. The locale selector matters because boundary rules differ by language.
One grapheme can be two code units, or eleven
An é typed as e plus a combining accent is one letter but two code units and three UTF-8 bytes; the precomposed form is one unit and two bytes. Identical on screen, different to every limit.
CRLF and LF agree on lines, not on bytes
A Windows CRLF pair is one separator, so line counts match your editor — each CRLF just costs an extra byte. A paste mixing endings is reported plainly: Mixed line endings: 1 CRLF, 1 LF.
Zero-width characters inflate counts invisibly
Text copied from rendered pages can carry zero-width spaces, joiners and interior byte-order marks no font displays. The panel names the real number — 1 zero-width character inflates the character count — so an off-by-one has an explanation.
X charges every link exactly 23 units
A 40-character URL and a 400-character URL both cost 23 of the 280 weighted units — X serves every link through its t.co shortener. Latin text mostly weighs 1 per code point; CJK and emoji weigh 2, so 日本語 alone spends 6 units.
A 10 MB paste is counted off the main thread
Past 128 KB counting moves to a background worker with a busy state and a Cancel control, so typing never freezes. The only ceiling is a 32 MB memory guard; past it the input is refused whole, never truncated.
Common errors
This looks like a binary file, not text — counts would be meaningless.- Dropped files are sniffed first: a NUL byte in the first 8,192 bytes marks the file as binary, and the input keeps whatever text was there.
Long link — some chats truncate it. Consider Download instead- A share link carries the whole text inside the URL. Past 2,000 characters the warning appears because chat apps clip long links; past 16,000 sharing is refused and Download state (.json) hands over a file instead.
Input is larger than the 32 MB limit for this tool. For bigger files use the CLI: wc -w -l -m file.txt- The ceiling is an out-of-memory guard — free text itself can never fail to count. The input is declined whole, never partially counted; wc reads any size locally.
FAQ
Why does this word count differ from my word processor's?
Editors disagree about hyphens, contractions and numerals, so totals drift on the same text. This page follows Unicode's segmentation standard, UAX #29, through the segmenter your browser ships — a published rule set, reproducible elsewhere.
How can a single emoji count as eleven characters?
A family emoji is several person symbols joined invisibly: storage sees 11 UTF-16 code units and 25 UTF-8 bytes where a reader sees one figure. Each platform bills in its own unit.
Is the text I paste uploaded to be counted?
No. Counting, the meters and dropped files are all processed inside this tab; no request carrying your text is ever made.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Recount now, without the typing pause.
- ⌘/Ctrl + S
- Download the stats block as a .txt file.
- ⌘/Ctrl + C
- Copy the stats block when nothing is selected.
- ⌘/Ctrl + Shift + C
- Copy the stats block even mid-selection.
- t
- Cycle the theme (idle while typing).
- ? or ⌘/Ctrl + /
- Open the shortcut reference.
- Esc
- Close the dialog; focus returns to its opener.