String Inspector: Length, Invisible & Lookalike Characters
Last updated:
Paste any text to see its four different lengths (characters, code points, UTF-16, UTF-8 bytes) and reveal what you can't see: zero-width spaces, bidi overrides, hidden tag text, Cyrillic lookalikes, NBSP, smart quotes. All in your browser, nothing uploaded.
How it works
A string doesn’t have one length — it has four. The thumbs-up with a skin tone, 👍🏽, is 1 character to a person, 2 Unicode code points, 4 UTF-16 code units, and 8 UTF-8 bytes. Which number you get depends on the language you ask:
| Counts | Languages | 👍🏽 |
|---|---|---|
| Graphemes | Swift .count |
1 |
| Code points | Python len(), Rust .chars().count() |
2 |
| UTF-16 units | JavaScript .length, Java length(), C# Length |
4 |
| UTF-8 bytes | Go len(), Rust .len() |
8 |
That’s why a “max 20 characters” check in a JavaScript front end and a Python back end can disagree on the same emoji-heavy username, and why slicing a JS string at a .length index can cut an emoji in half (this tool reports the leftover lone surrogate if you paste one).
- Revealed redraws your text with every invisible character shown as a label (
ZWSP,NBSP,RLO…) and every lookalike highlighted, so you can see exactly where it sits. - Hidden text in tag characters is decoded. Unicode tag characters (U+E0020–E007F) can spell out a whole sentence that renders as nothing at all — a known way to slip instructions into text an AI chatbot will read. If your text contains any, you’ll see the hidden message in plain ASCII.
- Clean up strips or replaces what was found, using the same rules — and NFC normalization fixes the “café” ≠ “café” problem, where one is
é(U+00E9) and the other iseplus a combining accent (U+0065 U+0301).
It doesn’t flag legitimate text. A flat blocklist of “suspicious” characters would raise alarms on most of the world’s writing, so the rules use context. The zero-width joiner that builds 👨👩👧 isn’t reported. Neither are the tag characters inside the Scotland flag 🏴, ordinary Russian or Greek words, or the zero-width non-joiner that Persian and Hindi spelling require (that one shows as info and Clean leaves it alone). Cyrillic а is only flagged inside a word that also has Latin letters, like pаypal.
Runs entirely in your browser — nothing you paste here is uploaded, logged, or stored. There’s no full Unicode name database (it’s around 1MB), so notable characters get their official names and the rest get a category label like “Cyrillic lowercase letter”.