How to audit a document for hidden characters
A practical checklist for checking any text you did not write yourself, and for verifying that cleanup actually worked.
Hidden characters · 2 min read
If you publish, forward, or sign off on text that came from somewhere else, it is worth knowing what is in it. Here is the practical sequence.
1. Paste, do not retype
Retyping destroys exactly the evidence you are looking for. Every invisible character survives copy-paste and none survives being typed by hand. Paste from the original source, not from a screenshot, not from a PDF viewer's text panel if you can get the underlying file.
2. Scan by category, not by find-and-replace
Searching for a specific character tells you about that character. There are dozens that matter, across four distinct groups:
- Invisible: zero-width characters, soft hyphens, bidi controls, tag characters, variation selectors, Hangul fillers
- Spacing: non-breaking, en, em, thin, hair, ideographic spaces
- Typographic punctuation: em dashes, en dashes, curly quotes, single-codepoint ellipsis
- Wording: vocabulary and cadence markers, which are not characters at all
A scan that reports counts per category tells you what kind of problem you have. A single find-and-replace does not.
3. Read the counts, not just the total
The categories mean different things:
- A handful of non-breaking spaces and curly quotes: almost certainly a word processor or CMS. Unremarkable.
- Dozens of zero-width characters spread evenly through the text: worth a second look. Even distribution is not what formatting artefacts look like.
- Any tag characters at all outside an emoji flag: deliberate. That block has no other everyday use.
- Variation selectors on ordinary letters rather than emoji: also deliberate.
4. Clean the exact layer first
Character removal is deterministic and lossless. Do it before anything else, and do it without a model involved — there is no reason to accept rewriting risk for a job that is pure matching.
5. Verify by re-scanning
This is the step people skip, and it is the only one that proves anything. Re-run the scan on the cleaned output. The removable count should be zero. If it is not, the cleanup missed a category.
This verifiability is the whole reason to prefer character-level work over probabilistic claims. You are not trusting a confidence score. You are checking a count.
6. Decide separately about wording
Vocabulary and cadence markers cannot be stripped, only rewritten, and rewriting always carries some risk to meaning. That is a judgement call about your document, not a cleanup step. Make it deliberately, and read the result.
A note on what a clean scan proves
A zero count means the text has no hidden characters and no obvious stylistic tells. It does not prove nobody can identify the text's origin.
Statistical watermarks are invisible to character-level analysis by design. Claude marks text from models launched on or after 2 August 2026, and Gemini carries SynthID. Neither shows up in a character scan, and neither has a public detector in Anthropic's case — so a clean scan says nothing either way about them.
Being precise about that boundary is more useful than a reassuring number.
Run the scan on your own document. It is free, unlimited, and runs in your browser rather than on a server.