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 is e plus 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”.

🔀 Also try: Text Diff Checker → 🔗 Also try: URL Encoder & Decoder →