You copy a neat snippet from an LLM chat window. You paste it into VS Code. Everything looks completely fine. The indentation is right, the variable names are clear, and there is no red squiggle in your editor.
Then you run your build:
SyntaxError: Unexpected token '' (U+200B) in JSON at position 142
Or in Python:
SyntaxError: invalid character '' (U+200B)
You stare at line 14. There is nothing there. You backspace the whitespace, retype it, and suddenly the error disappears.
If you have spent any time copying code from conversational AI assistants over the past two years, you have almost certainly encountered this phantom bug. Here is what is actually going on, why compilers hate it, and how to sanitize your code before it lands in a pull request.
The Phantom Characters: Unicode Zero-Width Tokens
When large language models generate text or format markdown tables and fenced code blocks, the clipboard content frequently inherits non-printable Unicode characters.
The most common culprits include:
| Unicode Hex | Name | Purpose in Text | Why Compilers Choke |
|---|---|---|---|
\u200B |
Zero-Width Space | Word break opportunity without visible space | Read as an unexpected literal token |
\uFEFF |
Byte Order Mark (BOM) | UTF byte order marker | Breaks JSON parsers and strict headers |
\u200C |
Zero-Width Non-Joiner | Prevents typographic ligatures | Invalids identifier syntax |
\u200D |
Zero-Width Joiner | Combines complex emoji/scripts | Breaks regexes expecting ASCII |
\u00A0 |
Non-Breaking Space | Prevents automatic line wrapping | Breaks Python indentation levels |
Because these characters have zero advance width, modern font renderers draw them with a width of exactly zero pixels. To your eyes, the code is spotless. To the lexical scanner in your compiler, an alien byte is sitting right between your variable and its semicolon.
3 Places Zero-Width Spaces Cause Real Havoc
1. JSON Configuration Files (package.json, CI configs)
Standard JSON parsers (including Node.js's built-in JSON.parse and Python's json.loads) are strictly defined around RFC 8259. They do not allow unescaped control characters or foreign Unicode whitespace inside keys or values. A single \u200B inside a GitHub Actions YAML or tsconfig.json will fail the build with a cryptic parsing error.
2. Regular Expressions
If your code validates usernames, slugs, or emails:
const usernameRegex = /^[a-zA-Z0-9_]{3,16}$/;
const input = "kyiron\u200B";
console.log(usernameRegex.test(input)); // false!
The test fails even though input visibly prints as "kyiron". In production, this leads to bizarre bugs where users cannot log in or forms reject valid inputs.
3. Git Diffs and Code Review
When invisible characters get committed, Git treats the line as modified. If another developer's editor automatically strips trailing whitespace or normalizes Unicode on save, you end up with noisy ghost diffs where lines change without any visible difference.
How to Detect Them in Terminal
If you suspect a file has contaminated invisible characters, you can inspect it in your shell using cat or od:
# Print non-printable characters visually (shows \u200B as M-BM-^K or similar)
cat -v config.json
# Or find exact hex positions:
grep -P "[\x{200B}\x{FEFF}\x{200C}\x{200D}]" src/index.ts
In Node.js, you can test a string with a simple regex:
const hasZeroWidth = /[\u200B-\u200D\uFEFF]/.test(copiedCode);
if (hasZeroWidth) {
console.warn("Contaminated code snippet detected!");
}
The Instant In-Browser Solution
If you copy snippets frequently from ChatGPT, Claude, or Gemini, having to write terminal regexes every time is tedious.
I built a free utility within UnmarkPro specifically to handle this: the AI Text Sanitizer & Zero-Width Scrubber.
- What it does: You paste your copied code or markdown. It immediately highlights invisible characters in red, shows you their exact Unicode hex identifiers, strips them cleanly, and lets you copy the sanitized code with one click.
- Privacy: Runs 100% locally in your browser. No text is sent to any server, making it safe for proprietary codebases, API configs, and client deliverables.
- Zero sign-up: No accounts, no paywalls, no tokens.
You can read the deep-dive guide on zero-width spaces in AI code here.
Best Practices for AI-Assisted Development
-
Enable Unicode Highlight in VS Code: In VS Code settings, search for
editor.unicodeHighlight.invisibleCharactersand set it totrue. This will outline zero-width tokens with a small yellow box. -
Sanitize Prompt Dumps: Before saving AI boilerplate into shared config files, run it through a sanitizer or inspect it via
cat -v. -
Add Linter Rules: Add an ESLint rule like
no-irregular-whitespaceto catch foreign spaces at the pull-request stage before they reach production.
Top comments (0)