Real-time character count with social limit checking.
Count characters with and without spaces, plus words, sentences, paragraphs, and bytes. Get instant statistics keyed to social media limits, SEO meta limits, SMS, and other character-bounded contexts. Live updating as you type. Everything runs locally in your browser.
Counting characters is more nuanced than it sounds. The string "café" has four characters by visual count. But the underlying byte count depends on encoding. Five bytes in UTF-8 (the "é" is two bytes), four characters in JavaScript's length property (it counts UTF-16 code units, which happens to match for this example), and one to five depending on how you count clusters in unusual scripts.
This tool exposes three counts that cover the cases that come up in practice: visible characters (graphemes. What a human sees), code points (Unicode characters as the spec defines them), and bytes (UTF-8). For most everyday text, all three numbers are identical or close. For text with emojis, accented letters, or non-Latin scripts, they diverge in ways that matter for character-limited fields.
Twitter, Mastodon, and threads character limits. Twitter counts 280 "characters" using a weighted system where most Latin characters are 1 unit but CJK characters are 2. Mastodon uses straight Unicode code point count up to 500. Bluesky's count is 300 graphemes. Each platform's count differs subtly. The tool's grapheme count matches Mastodon and Bluesky closely; for Twitter, expect a small overcount on CJK-heavy text.
SMS character limits. Standard SMS (GSM-7 encoding) fits 160 characters. Adding any non-GSM character. Emojis, accented letters, smart quotes. Switches to UCS-2 encoding, which limits the message to 70 characters. Knowing the count, and watching what character pushes you into UCS-2, prevents surprise multi-message billing.
SEO meta description and title. Google truncates meta descriptions around 155–160 characters in desktop search results, less on mobile. Title tags truncate around 60 characters. Writing right up to the limit (without overflow) maximizes the visible search snippet.
Email subject lines. Mobile email clients show roughly 25–30 characters of subject; desktop clients show 50–70. Subject lines optimized for both fit under 50 characters, ideally with the most important word first.
Form field validation testing. Database columns have maximum lengths. To verify form validation, paste exactly N characters and submit. The counter helps you generate boundary-test inputs precisely.
Password length checks. Some sites cap passwords at 16, 32, 64, or 128 characters. Knowing your candidate password length helps anticipate cap behavior before submission.
Translation and localization length budgets. Translated UI text often runs 30–50% longer than English. If your English button label is 20 characters, the German version might need 30. Budget character allocations for translated copy.
Code comment and commit message conventions. Git commit message subject lines should fit under 50 characters; body lines should wrap at 72. Many editors don't enforce this; the counter catches lines that are too long.
Three different definitions of "character" produce three different counts, and which one you want depends on the context.
Graphemes are what humans see. One "character" per visible mark. The string "👨👩👧" (family emoji) is one grapheme even though it's built from four code points joined by zero-width joiners. Modern social platforms count graphemes because that's what users perceive.
Code points are Unicode-defined "characters". The abstract entities that the standard assigns numbers to. The family emoji above is 4 code points (the man, the woman, the girl, plus the joiner. Actually 7 if you count all the joiners and the variation selectors). Code point count is what you get from JavaScript's [...str].length or Python's len(s).
Bytes (UTF-8) are the actual storage size when text is encoded as UTF-8 (the dominant encoding on the web). One ASCII character is 1 byte; one accented Latin character is 2 bytes; one CJK character is 3 bytes; one emoji is 4 bytes (or more, for emoji sequences). Database column size limits, API payload limits, and disk-space-per-message metrics all care about byte count, not visible character count.
For Twitter-style limits and SMS limits, code-point count is closest to what's enforced. For database fields and storage budgets, byte count matters. For "what does the user see," graphemes are the right answer.
Treating JavaScript's str.length as character count. JavaScript's length is UTF-16 code unit count. For ASCII it equals character count; for emojis and supplementary-plane characters, it can be twice the visible count. "😀".length is 2, not 1.
Forgetting that pasted text contains hidden characters. Copy-pasting from chat apps, websites, or PDFs can introduce zero-width spaces, non-breaking spaces, BOMs, and other invisible characters that count toward the limit but don't appear visually. If your character count is mysteriously high, paste through Remove Spaces (all-whitespace mode) first.
Counting line breaks. Newlines are characters. A 3-line text with 60 characters per line counts as 182 characters (60 + newline + 60 + newline + 60), not 180. This catches people writing multi-line tweets that fit individual lines but exceed the total cap.
Smart quote conversion. Word and Google Docs auto-convert straight quotes (") to curly quotes (", "). Curly quotes are 3 bytes in UTF-8 versus 1 for straight quotes. If you're optimizing for SMS or other byte-counted contexts, paste through with quotes preserved as straight ASCII.
This tool. Fastest for live counting outside a word processor, exposes graphemes vs code points vs bytes explicitly.
Microsoft Word's character count (Tools → Word Count). Counts UTF-16 code units, similar to JavaScript's length. Differs from grapheme count for emojis and complex scripts.
Twitter's character counter. Uses Twitter-specific weighting (CJK characters count as 2). Will differ slightly from this tool's grapheme count on Asian-language content.
Email subject line testers. Usually count code units (matching most email clients' truncation behavior). For email work specifically, prefer dedicated subject-line testers.
The counter listens for input changes and re-counts on every keystroke. Grapheme count uses Intl.Segmenter with granularity: "grapheme" in modern browsers, falling back to a regex-based grapheme cluster splitter for older browsers. Code point count uses [...str].length. Byte count uses new TextEncoder().encode(str).length.
For typical text under a few thousand characters, counting is instant. Very long inputs (hundreds of thousands of characters) cause noticeable per-keystroke lag in some browsers; for those use cases, paste once and read the count rather than typing.
For social posts, count after writing. Don't try to write to a count. Write the post, then trim to fit. Self-conscious counting while drafting produces awkward phrasing.
For SMS, watch for encoding switches. If your text fits comfortably under 160 characters, it ships as one SMS. Add a single emoji or accented letter and you switch to 70-character messages. The boundary catches people sending what they thought was one message but actually paid for three.
For meta descriptions, write 150 not 160. Search engines truncate based on pixel width, not character count exactly. A 160-character description with wide letters (W, M) might truncate at 145; a description with narrow letters (i, l) might fit 170. Aim 5–10 characters short of the cap for safety.
Most simple counters use code unit or code point count, where an emoji can be 1, 2, or more units. Modern grapheme-aware counters (this one, Twitter, modern Mastodon clients) count visible emojis as 1.
Yes. Newlines are characters and contribute to the count, including the byte count.
Yes. Cyrillic, Greek, Arabic, Hebrew, Chinese, Japanese, Korean, and other scripts are all counted correctly. Byte count varies (1 byte for Latin, 2 for most accented Latin and Cyrillic, 3 for CJK and most non-Latin scripts).
Close, not exact. Twitter applies a weight to CJK characters (counting them as 2 each) that this tool's grapheme count doesn't replicate. For Latin-script tweets, the counts match; for tweets containing CJK characters, expect a small undercount versus Twitter's display.
UTF-8 uses 1 byte for ASCII, 2 for most accented Latin and Cyrillic, 3 for CJK, and 4 for emojis and rare characters. The byte count exceeds the character count whenever your text contains anything beyond plain ASCII.
Yes, but the count includes the markup characters. To count only visible characters of formatted text, paste the rendered (non-source) version.