Word Counter& Reading Time

Real-time word, character, paragraph count with reading time estimate. Fully local — your text never leaves your browser.

Enter your text

Stats update in real time as you type

Statistics
Estimated reading timeChinese ~500 chars/min · English ~200 words/min
CJK CharactersChinese, Japanese, Korean
English wordswhitespace-separated
Charactersincluding spaces
Characters (no spaces)excluding whitespace
Paragraphsseparated by blank lines
Sentences. ! ? 。!? …
UTF-8 byte size

Did this tool solve your problem?

Code Examples

JavaScript
const text = "Hello 世界";

// CJK characters (Chinese, Japanese, Korean)
const cjk = (text.match(
  /[\u4e00-\u9fff\uac00-\ud7af]/g
) ?? []).length; // 2

// English words
const words = (text.match(
  /[a-zA-Z][a-zA-Z'-]*/g
) ?? []).length; // 1

// Reading time (ms)
const mins = cjk / 500 + words / 200;
Python
import re

text = "Hello 世界"

# CJK characters (Chinese, Japanese, Korean)
cjk = len(re.findall(
    r'[\u4e00-\u9fff\uac00-\ud7af]', text
))  # 2

# English words
words = len(re.findall(
    r'[a-zA-Z][a-zA-Z\'-]*', text
))  # 1

# Characters without spaces
no_sp = len(text.replace(" ", ""))
TypeScript
function wordStats(text: string) {
  const cjk = (text.match(
    /[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]/g
  ) ?? []).length;
  const words = (text.match(
    /[a-zA-Z][a-zA-Z'-]*/g
  ) ?? []).length;
  const paragraphs = text
    .split(/\n\s*\n/)
    .filter(p => p.trim()).length;
  return { cjk, words, paragraphs };
}
Go
import (
    "regexp"
    "unicode"
)

func countCJK(s string) int {
    count := 0
    for _, r := range s {
        if unicode.Is(unicode.Han, r) ||
           unicode.Is(unicode.Hangul, r) {
            count++
        }
    }
    return count
}

var wordRe = regexp.MustCompile(
    `[a-zA-Z][a-zA-Z'-]*`)

Frequently Asked Questions

How are CJK characters counted?
The tool counts Unicode CJK Unified Ideographs including common Chinese characters (U+4E00–9FFF), Extension A (U+3400–4DBF), Compatibility Ideographs (U+F900–FAFF), Japanese Hiragana/Katakana (U+3040–30FF), and Korean Hangul Syllables (U+AC00–D7AF).
How are English words counted?
English words are counted as consecutive letter sequences, optionally including hyphens and apostrophes. For example: don't counts as 1 word, state-of-the-art counts as 1 word. Pure numbers are not counted as words.
How is reading time calculated?
Chinese reading speed is estimated at ~500 characters/minute (adult silent reading), and English at ~200 words/minute. For mixed text, both are calculated separately and summed for a more accurate estimate.
How are paragraphs defined?
A paragraph is a block of text separated by one or more blank lines. A single newline does not create a new paragraph — consistent with Markdown and most writing tools.
Is my text sent to any server?
No. This tool runs entirely in your browser. All calculations happen locally — your text never leaves your device, making it safe for sensitive documents.
What is the UTF-8 byte size used for?
The byte size shows how much storage the text actually takes in UTF-8 encoding. It's useful for checking database field limits (e.g. VARCHAR length), API request payload sizes, or file storage. Chinese characters typically take 3 bytes each in UTF-8.