CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Should cleaned URL data use encodeURI or encodeURIComponent?
Choose according to the destination argument. In our fixture encodeURI retains / ? = #, while encodeURIComponent escapes them. Cleaning removes U+200B but does not choose that boundary or decode existing %2F.
Open the Claude text cleaner · Full measured data
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. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. Destination observations run independently on the exact input and cleaned strings in the recorded Node runtime. We make no detector-score or statistical-watermark removal claim.
| Fixture and mode | Input string and code points | Output and cleaner status | Observed before / after |
|---|---|---|---|
| Marked delimiters direct string / keep / invisible true | "a/b?c=d#e"U+0061 U+200B U+002F U+0062 U+003F U+0063 U+003D U+0064 U+0023 U+0065 | "a/b?c=d#e"Removed 1 invisible character | {"wholeURI":"a%E2%80%8B/b?c=d#e","component":"a%E2%80%8B%2Fb%3Fc%3Dd%23e"}{"wholeURI":"a/b?c=d#e","component":"a%2Fb%3Fc%3Dd%23e"} |
| Plain delimiters direct string / keep / invisible true | "a/b?c=d#e"U+0061 U+002F U+0062 U+003F U+0063 U+003D U+0064 U+0023 U+0065 | "a/b?c=d#e"No selected invisible characters found | {"wholeURI":"a/b?c=d#e","component":"a%2Fb%3Fc%3Dd%23e"}{"wholeURI":"a/b?c=d#e","component":"a%2Fb%3Fc%3Dd%23e"} |
| Space in data direct string / keep / invisible true | "a b"U+0061 U+0020 U+0062 | "a b"No selected invisible characters found | {"wholeURI":"a%20b","component":"a%20b"}{"wholeURI":"a%20b","component":"a%20b"} |
| Already encoded slash direct string / keep / invisible true | "a%2Fb"U+0061 U+0025 U+0032 U+0046 U+0062 | "a%2Fb"No selected invisible characters found | {"wholeURI":"a%252Fb","component":"a%252Fb"}{"wholeURI":"a%252Fb","component":"a%252Fb"} |
Two encoders preserve different punctuation
The marked fixture contains a slash, question mark, equals sign and fragment marker after an authored U+200B. Both encoders escape the marker before cleanup. After deletion, encodeURI leaves the visible delimiters in the result, whereas encodeURIComponent represents them as percent sequences. The plain-delimiter reference has the same difference without an edit. Both encoders produce a%20b for the space reference. Both turn the percent sign in a%2Fb into %25, yielding a%252Fb. The cleaner leaves that pre-encoded spelling untouched. These results isolate deletion, reserved punctuation and another encoding pass as separate observable operations.
Neither API infers the intended URL component
We call the two JavaScript encoder functions directly and do not construct a URL, navigate a browser or contact a server. The strings are data fixtures rather than complete destinations. Our earlier surrogate guide examines failure on an unmatched UTF-16 surrogate; this matrix concerns ordinary punctuation and existing percent signs. The percent-encoding guide explains decoding stages, but no decoding occurs in this test. The cleaner does not know whether its output will become a complete URI or a single parameter value. An encoded result can be syntactically valid for one argument and unsuitable for a different argument boundary.
Identify the argument before encoding its text
Keep the unencoded source and document where it will be inserted. Use the destination API for that specific argument and test delimiters that should remain data rather than structural punctuation. Avoid passing an already encoded value through another encoder unless that extra layer is part of the format contract. A zero-width deletion does not remove literal percent signs or establish whether they represent text or a prior encoding. The four measured examples show the chosen APIs on known strings; they do not validate a complete URL, establish a server decoding policy or promise that repeated encoding and cleanup can be safely interchanged.
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.cjsReference and next check
ECMAScript encodeURI 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.