Count characters, grapheme clusters, and code points in real time. Detect invisible characters, analyze Unicode composition, check social media limits, and estimate AI tokens β all processed locally in your browser.
Precision Unicode grapheme & byte analyzer
A character counter measures every individual unit in a text β including letters, numbers, spaces, punctuation marks, symbols, emojis, and hidden Unicode characters.
Unlike basic tools that rely solely on JavaScript's string.length (which incorrectly counts complex emojis as multiple characters), our counter uses the native Intl.Segmenter API to measure Grapheme Clusters β giving you the exact count that human eyes perceive.
Why traditional character counters get emojis wrong
In programming, "character" has multiple definitions. A single family emoji (π¨βπ©βπ§βπ¦) looks like 1 character to a user, but consists of 7 Unicode code points and 11 UTF-16 code units in JavaScript memory!
Our tool calculates all three levels simultaneously (Graphemes, Code Points, and UTF-16 Units), so whether you are writing a tweet or allocating a database column, you get 100% accurate metrics.
Official character limits and truncation points for major platforms
Social media platforms enforce strict character bounds. Use this table to craft perfectly formatted posts that won't get truncated mid-sentence:
| Platform / Network | Post Character Limit | Visible Truncation Point | Bio / Profile Limit | Key Guidelines |
|---|---|---|---|---|
| X (Twitter) | 280 chars (Free) / 25k (Premium) | 280 chars | 160 chars | URLs automatically count as 23 chars |
| 2,200 chars | 125 chars | 150 chars | First 125 chars visible before 'See More' | |
| 63,206 chars | 470 chars | 101 chars | Long posts formatted as expanded text | |
| 3,000 chars | 140 chars | 2,600 chars (About) | Headline limit is 220 characters | |
| Threads | 500 chars | 500 chars | 150 chars | Allows attached links and media |
| TikTok | 4,000 chars | 150 chars | 80 chars | Captions indexable for in-app search |
| 500 chars | 50 chars | 160 chars | Title limit is 100 characters | |
| YouTube | 5,000 chars (Description) | 120 chars | 1,000 chars | Title limit is 100 characters |
How complex Unicode emojis are constructed and counted
Emojis look simple, but under the hood they use complex Unicode sequences with Zero-Width Joiners (ZWJ) and skin tone modifiers:
| Emoji Category | Visual Example | Code Points | UTF-16 Units | Grapheme Count | Technical Sequence |
|---|---|---|---|---|---|
| Simple Smiley | π | 1 Code Point | 2 units | 1 Grapheme | U+1F600 |
| Skin Tone Modifier | ππ½ | 2 Code Points | 4 units | 1 Grapheme | Base + Skin Tone U+1F3FD |
| Flag Sequence | πΊπΈ | 2 Code Points | 4 units | 1 Grapheme | Regional Indicators U+1F1FA U+1F1F8 |
| Family ZWJ Sequence | π¨βπ©βπ§βπ¦ | 7 Code Points | 11 units | 1 Grapheme | Man + ZWJ + Woman + ZWJ + Girl + ZWJ + Boy |
| Keycap Sequence | 1οΈβ£ | 3 Code Points | 4 units | 1 Grapheme | Digit 1 + Variation Selector + Keycap |
Google SERP title tag and meta description guidelines
| SEO Element | Character Target | Pixel Limit (Desktop) | Pixel Limit (Mobile) | Best Practice Strategy |
|---|---|---|---|---|
| Meta Title Tag | 50 - 60 chars | 580 - 600 px | 480 - 500 px | Front-load primary keyword and click-hook within first 50 chars |
| Meta Description | 140 - 155 chars | 920 - 990 px | 680 - 750 px | Include primary CTA and keyword variant; avoid truncating main value |
| H1 Headline | 20 - 70 chars | Flexible | Flexible | Match user search intent and primary keyword naturally |
Storage size differences between UTF-8, UTF-16, and UTF-32
Detecting zero-width spaces, BOMs, and hidden symbols
Pasting text from websites or PDFs often introduces hidden Unicode characters like Zero-Width Spaces (U+200B) or Soft Hyphens (U+00AD).
These invisible characters cause unexplained API payload errors, broken database constraints, and string search mismatches. Our tool automatically flags 20+ types of invisible characters for instant removal.
Recommended algorithms and API patterns for accurate text measurement
Always use Intl.Segmenter({ granularity: 'grapheme' }) for user-facing input limits.
Never use string.length for emoji or international text validation.
For database column constraints (e.g. MySQL UTF-8), measure byte buffers instead of characters.
Call String.prototype.normalize('NFC') before comparing or counting accented text.
Replicate X/Twitter URL 23-char rules and CJK double-width character weighting.
Use [...text].length as a fallback for code point counting when segmenter is unavailable.
Common questions about character counting, graphemes, and limits
A character counter is a tool that counts the number of characters in a text, including letters, numbers, symbols, punctuation, spaces, and special characters. Our tool goes beyond basic counting by also measuring grapheme clusters, Unicode code points, and byte sizes across different encodings.
Characters, in programming terms, typically refer to UTF-16 code units (what JavaScript's .length returns). Grapheme clusters are what humans visually perceive as a single character. For example, the family emoji (π¨βπ©βπ§βπ¦) is 1 grapheme cluster but consists of 7 code points and 11 UTF-16 units. Our tool uses the Intl.Segmenter API for accurate grapheme counting.
We use the browser's built-in Intl.Segmenter API with grapheme granularity, which follows the Unicode Standard Annex #29. This correctly counts composite emoji (family emoji, flag emoji, skin-toned emoji) as single grapheme clusters, unlike tools that use string.length which count them as multiple characters.
Invisible characters are Unicode characters that have no visible representation but occupy space in your text. Examples include Zero Width Space (U+200B), Byte Order Mark (U+FEFF), and Non-Breaking Space (U+00A0). They can cause issues with text processing, copy-paste behavior, and data validation. Our tool detects over 20 types of invisible characters.
X/Twitter allows 280 characters per post for free accounts and up to 25,000 characters for Premium subscribers. Bios are limited to 160 characters. Note that URLs always count as 23 characters regardless of their actual length, and some CJK characters count as 2 characters.
Instagram captions can be up to 2,200 characters with up to 30 hashtags. However, only the first 125 characters appear before the 'See more' cut-off in the feed, so it's important to front-load your hook. Instagram bios are limited to 150 characters.
LinkedIn posts allow up to 3,000 characters. The 'See more' threshold is approximately 210 characters on desktop and 140 on mobile. LinkedIn headlines are limited to 220 characters, and the About section allows 2,600 characters.
TikTok captions allow up to 4,000 characters. The 'See more' cut-off is approximately 100 characters, so the first line matters most. TikTok bios are limited to 80 characters.
Google does not use fixed character limits β it truncates based on pixel width. For meta titles, aim for 50-60 characters (approximately 580-600 pixels). For meta descriptions, target 140-155 characters (approximately 920 pixels). Our SERP Preview shows you exactly how your content will appear in search results.
ASCII is a 7-bit encoding standard that covers 128 characters (English letters, digits, and basic symbols). Unicode is a much larger standard that encompasses over 150,000 characters from virtually every writing system, plus emoji and special symbols. ASCII is a subset of Unicode. Our tool shows the ratio of ASCII to Unicode characters in your text.
AI tokens are estimated based on average characters-per-token ratios for each model. GPT-4o uses approximately 4 characters per token, Claude 4 uses about 3.5, and Gemini 2.5 uses about 4. These are approximations β actual token counts depend on the model's specific tokenizer and the content of your text.
These are different ways to encode Unicode text into bytes. UTF-8 uses 1-4 bytes per character (efficient for ASCII-heavy text), UTF-16 uses 2 or 4 bytes (used by JavaScript, Java, and Windows), and UTF-32 uses exactly 4 bytes per character (simple but space-inefficient). Our tool shows the byte size of your text in all three encodings.
Absolutely. All text processing happens 100% locally in your browser using JavaScript. Your text is never sent to any server, API, or third-party service. Nothing is uploaded, tracked, or stored externally. Your text stays on your device at all times.
Yes. Our tool supports all Unicode-compatible languages including Chinese, Japanese, Korean, Arabic, Hindi, Thai, Russian, and many more. The Intl.Segmenter API provides locale-aware segmentation for accurate counting across writing systems.
Switch to Analyze mode and click any character to inspect it. The inspector shows the Unicode name, code point (U+XXXX), UTF-8/16/32 byte sizes, HTML entity, escape sequence, Unicode block, and general category. For composite characters, it breaks down each individual code point.
A code point is a unique numerical value assigned to each character in the Unicode standard, written as U+ followed by a hexadecimal number (e.g., U+0041 for 'A', U+1F600 for 'π'). A single grapheme cluster (visible character) can consist of multiple code points.
When invisible characters are detected, our tool displays them in the Invisible Character Detector section with their names, code points, and positions. Click 'Remove All' to clean your text instantly. You can also see them highlighted in Analyze mode by enabling the 'Invisible' highlight toggle.
Characters with spaces counts every single character including spaces, tabs, and line breaks. Characters without spaces excludes all whitespace characters (spaces, tabs, returns). The 'without spaces' count is useful for determining actual content length without whitespace padding.
Yes. We offer four export formats: TXT (plain text summary report), CSV (character frequency data for spreadsheets), JSON (full analysis data for developers), and Markdown (formatted report). You can also copy key statistics to your clipboard with one click.
Compare mode lets you see the difference between your original text and an edited version side by side. It shows the change in characters, words, and grapheme clusters, plus how many unique characters were added or removed. Useful for tracking editing progress.
Yes. Toggle the 'Regex' option in the Search & Replace panel to use regular expression patterns. You can also toggle case sensitivity. Replace individual matches one at a time or replace all at once.
Reading time is calculated based on the average adult reading speed of 238 words per minute. Speaking time uses 130 words per minute. These are evidence-based averages from reading research, though actual speeds vary by individual and text complexity.
Some visible characters are composed of multiple code points. Examples include emoji with skin tone modifiers (e.g., ππ½ = thumbs up + skin tone), flag emoji (e.g., πΊπΈ = U+1F1FA + U+1F1F8), family emoji joined by Zero Width Joiners, and accented characters using combining marks (e.g., Γ© can be e + combining acute accent).
A single SMS message supports 160 characters using the GSM 7-bit encoding (standard Latin characters). If you use Unicode characters (emoji, non-Latin scripts), the limit drops to 70 characters per segment. Messages exceeding the limit are split into multiple segments.
Yes. The tool is optimized for documents with 1,000,000+ characters using efficient single-pass algorithms, paginated tables, and memoized computations. All processing happens locally in your browser with minimal memory usage.
The breakdown covers: Letters (uppercase/lowercase), Numbers, Whitespace (spaces, tabs, line breaks), Symbols, Punctuation, Emoji, Currency symbols, Mathematical symbols, Accented characters, ASCII vs Unicode characters, Control characters, Invisible characters, Printable vs non-printable characters, and Special characters.
In Analyze mode, toggle highlight buttons to visually color-code different character types: Emoji (amber), Numbers (blue), Uppercase (red), Lowercase (green), Whitespace (gray), Invisible (purple), Symbols (pink), and Punctuation (orange). Click any highlighted character to inspect it.
Threads allows up to 500 characters per post and 150 characters for your bio. These limits apply to all Threads posts regardless of account type.
Yes. Your text is automatically saved to your browser's local storage with a 500ms debounce. When you return to the tool, your previous text will be restored. This data never leaves your browser β it's stored only on your device.
Pinterest Pin descriptions allow up to 500 characters, Pin titles up to 100 characters, board descriptions up to 500 characters, and profile bios up to 160 characters.
0
0 Unicode code points
0
0 chars / word
0
0 words / sentence
0
0 total lines
0
0 spaces
0
User-perceived symbols
0s
Based on 200 wpm
0s
Based on 130 wpm
~0
GPT-4 / Claude est.