ByteScope

Invisible Character Checker

Paste text or drop a file and see every character that does not show on screen — zero-width spaces, bidi overrides, Unicode tags, odd spaces, Cyrillic letters hiding in a Latin word — each as a badge with its code point, then remove the ones you choose.

Your files never leave your browser — all processing is local.

Drop a text file here

UTF-8, UTF-16 or a legacy encoding, up to 20 MiB — or click to browse. Read in this tab, nothing uploaded.

Text type

The text type only changes how serious each finding is rated, never what is found.

What this check cannot tell you

  • This is not an AI detector. Finding these characters does not show the text came from AI, and finding none does not show it did not.
  • Look-alike letters are only checked inside words that mix Latin with another script. A word spelled entirely in Cyrillic to pass as Latin (a whole-script fake) is not detected.
  • Zero-width characters and variation selectors have legitimate uses in emoji, Persian and Indic scripts. The “looks legitimate” label is a heuristic and can be wrong in either direction.
  • Font-level confusion is not detected: l and I, or 0 and O, are different ASCII characters that only look alike in some fonts.
  • The Latin skeleton is a subset of the UTS #39 skeleton: only Cyrillic, Greek, Armenian and Cherokee letters that map to plain A–Z or 0–9 are replaced, and there is no NFD decomposition. Confusables data: Unicode 17.0.0.

About this tool

Text can carry characters that take up no space on screen and still change what it means: a zero-width space that breaks a search, a right-to-left override that makes code read differently from how it compiles, a run of Unicode tag characters spelling out an instruction only a language model will read, or a Cyrillic а inside a Latin word so that a link goes somewhere else. Paste text here, or drop a text file of up to 20 MiB — the encoding is detected automatically — and every suspicious character is shown in place as a badge such as ZWSP, RLO or TAG a, with its code point, Unicode name and category. Nothing is uploaded; the analysis runs in this tab.

What is flagged

Bidirectional controls — U+202A to U+202E, U+2066 to U+2069, and the LRM, RLM and ALM marks — the mechanism behind Trojan Source attacks, where source code reviewed on screen is not the code the compiler sees. Zero-width characters: U+200B ZWSP, U+200C ZWNJ, U+200D ZWJ, U+2060 WJ and U+FEFF. Unicode tag characters U+E0000 to U+E007F, decoded back to the ASCII they hide — a known way to smuggle instructions to an LLM in a prompt injection. Unusual spaces: NBSP, thin and narrow spaces, the ideographic space U+3000. Variation selectors, where many in a row may carry hidden data. Other format characters such as the soft hyphen, control characters, and private-use code points. Look-alike letters: Cyrillic or Greek letters mixed into a Latin word — paypal spelled with a Cyrillic р and а, for instance — found as mixed-script words using the Unicode UTS #39 confusables data. Three modes, prose, code and URL-or-username, change only the severity shown, not what is detected.

What is recognised as legitimate

Not every zero-width character is an attack. Emoji ZWJ sequences (the family and profession emoji), flag tag sequences, emoji presentation selectors, ZWNJ and ZWJ inside Persian and Indic scripts, the ideographic space in Chinese and Japanese text, and a leading BOM are all shown as information rather than warnings. Clean removes the bidi, tag and zero-width characters by default and leaves those legitimate uses alone; look-alike letters are replaced only in the words you confirm one by one, because a Greek word in a Greek sentence is not a fake. Copy the result or download it as a file.

Limits

Finding these characters does not mean the text was written by AI; finding none does not mean it was not. Many “ChatGPT watermark characters” claims are ordinary typography — a non-breaking space, a narrow space, an em dash — that word processors and web pages have inserted for decades. The look-alike check only sees mixed scripts: a word spelled entirely in Cyrillic is a valid Cyrillic word to it. The legitimate-use judgement can be wrong in either direction. And confusion that happens at the font level, such as a lower-case l and an upper-case I that look identical in some fonts, is not a Unicode matter and is not detected.

Frequently asked questions

Can this tell me whether a text was written by ChatGPT or another AI?

No. Finding these characters does not mean the text was written by AI; finding none does not mean it was not. Most of what gets passed around as “ChatGPT watermark characters” — non-breaking spaces, narrow spaces, em dashes — is ordinary typography that word processors, web editors and copy-paste from a browser produce on their own. What this page does tell you is exactly which characters are there and where, so you can decide for yourself what to make of them.

What is a zero-width space, and how did it get into my text?

U+200B ZWSP is a character with no width that marks a place where a line may break. It arrives through copy and paste from web pages, chat apps and some editors, and it is invisible until a search fails to match, a username is “taken” by an identical-looking one, or a file name refuses to open. Paste the text here, see each one as a ZWSP badge, and remove them with Clean — related characters such as U+200C ZWNJ, U+200D ZWJ, U+2060 WJ and U+FEFF are handled the same way.

What is Trojan Source, and how do I check code for it?

Trojan Source is the use of bidirectional control characters (U+202A to U+202E and U+2066 to U+2069) inside source code so that the order a reviewer sees on screen differs from the order the compiler reads — a comment can visually swallow a statement, or a string can end somewhere other than where it appears to. Paste the code here in code mode: every bidi control is shown as a badge at its position, and Clean removes them.

What are Unicode tag characters, and why are they used for prompt injection?

U+E0000 to U+E007F are a block of characters that mirror ASCII but render as nothing in almost every font. A sentence written in them is invisible to a human reading the page and perfectly readable to a language model that tokenises the raw text, which makes them a known carrier for hidden instructions in web pages, documents and chat messages. This page decodes a run of tag characters back into the ASCII it spells, so you see what the hidden text says, not just that it is there. The flag tag sequences used by some emoji are the one legitimate use and are shown as information.

How does the look-alike (homoglyph) letter check work?

It finds words that mix scripts — a Latin word with a Cyrillic or Greek letter inside it — using the Unicode UTS #39 confusables data to decide which letters are visually interchangeable. paypal with a Cyrillic р and а is flagged; a Russian sentence is not, because every letter in each word is Cyrillic. That also means a whole word written in Cyrillic to imitate a Latin one is not caught, and that fonts in which l and I look alike are outside what Unicode can tell you. Replacement happens only for the words you confirm, never automatically.

Will cleaning break my emoji, Persian text or Hindi text?

The default clean removes bidi controls, tag characters and zero-width characters, but the ones that have a recognised purpose are left in place: the ZWJ that holds a family or profession emoji together, the tag sequence of a flag, the presentation selector that makes a symbol render as emoji, and the ZWNJ and ZWJ that shape letters in Persian, Arabic and Indic scripts. Those are shown as information so you can see them, not as findings to remove. The judgement is heuristic and can be wrong either way, so look at the result before you paste it anywhere that matters.

Is my text uploaded?

No. Text and files are analysed in this tab with no request to any server; a 20 MiB file is read with the File API and its encoding detected locally. The cleaned result is copied or downloaded from memory. That is why the page is also fine for the text you would least want to send anywhere — a contract, a password list someone emailed you, a piece of code you suspect.