Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Will this cleaner fix curly quotes around JSON keys?

No. Our JSON objects using U+201C and U+201D as delimiters still fail parsing. Curly quotes inside an ASCII-quoted string are valid and are preserved.

Tested October 7, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Curly delimiters

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. File API and event-lifecycle tests include an additional stage described in the analysis. 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
Curly delimiters
direct string / keep / invisible true
"{“x”:1}"
U+007B U+201C U+0078 U+201D U+003A U+0031 U+007D
"{“x”:1}"
No selected invisible characters found
{"valid":false,"errorName":"SyntaxError"}
{"valid":false,"errorName":"SyntaxError"}
Curly content
direct string / keep / invisible true
"{\"x\":\"“hello”\"}"
U+007B U+0022 U+0078 U+0022 U+003A U+0022 U+201C U+0068 U+0065 U+006C U+006C U+006F U+201D U+0022 U+007D
"{\"x\":\"“hello”\"}"
No selected invisible characters found
{"valid":true,"value":{"x":"“hello”"}}
{"valid":true,"value":{"x":"“hello”"}}
Curly delimiters plus marker
direct string / keep / invisible true
"{“x”:​1}"
U+007B U+201C U+0078 U+201D U+003A U+200B U+0031 U+007D
"{“x”:1}"
Removed 1 invisible character
{"valid":false,"errorName":"SyntaxError"}
{"valid":false,"errorName":"SyntaxError"}
ASCII delimiters
direct string / keep / invisible true
"{\"x\":1}"
U+007B U+0022 U+0078 U+0022 U+003A U+0031 U+007D
"{\"x\":1}"
No selected invisible characters found
{"valid":true,"value":{"x":1}}
{"valid":true,"value":{"x":1}}

The position of the quote changes the result

The first input uses left and right double quotation marks as delimiters around x. JSON.parse rejects it both before and after cleanup. The second uses ASCII quotation marks to delimit the key and value, with curly quotation marks inside the value: that object parses and its content stays intact. In the mixed example a U+200B is deleted, but the remaining curly delimiters still make the object invalid. The ASCII reference parses throughout. The table records each whole object so readers can distinguish punctuation used as grammar from punctuation stored as data.

Visible punctuation is outside this repair

The homepage deletion map contains five named characters, not typographic quotation marks. Its dash option also does not convert quote characters. JSON syntax specifies U+0022 as the quotation mark delimiter. That primary rule explains why the grammar rejects a visually familiar substitute at this location. We test JSON.parse only, not permissive JavaScript object notation or an editor smart-quote setting. We did not copy these examples from a user document and do not infer which application introduced the punctuation. The outputs establish the exact unchanged sequences in this experiment.

Fix delimiters without rewriting the value

Identify the failed structural position with the destination parser and preserve the source. If delimiters were accidentally changed, correct those delimiters in a working copy and validate again. Replacing every curly quote would also modify legitimate prose such as our second value. Generate JSON with a serializer when possible instead of relying on word-processor punctuation. Even after the object parses, validate its schema and expected fields. Character cleanup cannot infer whether an opening curly quote is intended content or an accidental delimiter; the distinction requires the surrounding format and the intended value.

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

JSON grammar 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.