Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Will cleaning a URL remove percent-encoded hidden characters?

An actual U+200B in a URL path is deleted; its ASCII percent encoding %E2%80%8B survives. Compare the decoded path before deciding which route is intended.

Tested October 5, 2026 · v24.19.0 · 3 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Literal path

Measured inputs and outputs

These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. Invisible removal is enabled; the dash mode appears in each row. The observations below test this page's specific question. We make no detector-score or statistical-watermark removal claim.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Literal path
direct string / keep
"https://example.test/re​view"
U+0068 U+0074 U+0074 U+0070 U+0073 U+003A U+002F U+002F U+0065 U+0078 U+0061 U+006D U+0070 U+006C U+0065 U+002E U+0074 U+0065 U+00 …
"https://example.test/review"
Removed 1 invisible character
{"serialized":"https://example.test/re%E2%80%8Bview","path":"/re%E2%80%8Bview","decodedPath":"/re​view","isReview":false}
{"serialized":"https://example.test/review","path":"/review","decodedPath":"/review","isReview":true}
Encoded path
direct string / keep
"https://example.test/re%E2%80%8Bview"
U+0068 U+0074 U+0074 U+0070 U+0073 U+003A U+002F U+002F U+0065 U+0078 U+0061 U+006D U+0070 U+006C U+0065 U+002E U+0074 U+0065 U+00 …
"https://example.test/re%E2%80%8Bview"
No selected invisible characters found
{"serialized":"https://example.test/re%E2%80%8Bview","path":"/re%E2%80%8Bview","decodedPath":"/re​view","isReview":false}
{"serialized":"https://example.test/re%E2%80%8Bview","path":"/re%E2%80%8Bview","decodedPath":"/re​view","isReview":false}
Ordinary route
direct string / keep
"https://example.test/review"
U+0068 U+0074 U+0074 U+0070 U+0073 U+003A U+002F U+002F U+0065 U+0078 U+0061 U+006D U+0070 U+006C U+0065 U+002E U+0074 U+0065 U+00 …
"https://example.test/review"
No selected invisible characters found
{"serialized":"https://example.test/review","path":"/review","decodedPath":"/review","isReview":true}
{"serialized":"https://example.test/review","path":"/review","decodedPath":"/review","isReview":true}

The route distinction in our fixtures

The literal path and percent-encoded path serialize to the same encoded pathname before cleanup. Our homepage deletes the actual character from the first input, so that output parses with /review as its path. The encoded input contains ordinary ASCII percent signs, hex digits and letters; none belongs to the deletion map. Its decoded path still contains U+200B after cleaning. The clean reference stays unchanged. These measurements separate a text transformation from the subsequent URL parser and percent decoder.

A URL parser is not a route validator

The test uses the WHATWG URL implementation in the recorded Node runtime and a reserved example.test host. It makes no HTTP request to that host. A parseable URL can point at a nonexistent route, and a server can treat an encoded path differently from its decoded representation. We have not tested your router, redirects, reverse proxy or signed URL verification. The evidence establishes the exact strings at each stage; it does not establish that either spelling reaches the intended resource.

Repair a link with its destination in view

Keep the original link, inspect its parsed pathname and compare it with a known destination. If an accidental code point is present, change only the intended path component and rebuild the URL with a URL API. Do not decode the entire URL and then delete characters: escaped delimiters may become structural delimiters. Check query values and fragments separately, and verify the final link in its actual application. The homepage cleaner neither percent-decodes URLs nor chooses routes.

Reproduce this test

Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.

node reproduce.cjs

Reference and next check

WHATWG URL Standard provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.