Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Does cleaning preserve commas and newlines inside quoted CSV fields?

Our narrow CSV parser measures preserved quoted commas, escaped quotes and an embedded LF after U+200B removal. The field text changes; preserving record structure does not prove the value is intended.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Quoted comma

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. 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
Quoted comma
direct string / keep / invisible true
"id,note\r\n1,\"A,​B\""
U+0069 U+0064 U+002C U+006E U+006F U+0074 U+0065 U+000D U+000A U+0031 U+002C U+0022 U+0041 U+002C U+200B U+0042 U+0022
"id,note\r\n1,\"A,B\""
Removed 1 invisible character
{"rows":[["id","note"],["1","A,​B"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]}
{"rows":[["id","note"],["1","A,B"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]}
Quoted newline
direct string / keep / invisible true
"id,note\r\n1,\"A\n​B\""
U+0069 U+0064 U+002C U+006E U+006F U+0074 U+0065 U+000D U+000A U+0031 U+002C U+0022 U+0041 U+000A U+200B U+0042 U+0022
"id,note\r\n1,\"A\nB\""
Removed 1 invisible character
{"rows":[["id","note"],["1","A\n​B"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]}
{"rows":[["id","note"],["1","A\nB"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]}
Escaped quote
direct string / keep / invisible true
"id,note\r\n1,\"A\"\"​B\""
U+0069 U+0064 U+002C U+006E U+006F U+0074 U+0065 U+000D U+000A U+0031 U+002C U+0022 U+0041 U+0022 U+0022 U+200B U+0042 U+0022
"id,note\r\n1,\"A\"\"B\""
Removed 1 invisible character
{"rows":[["id","note"],["1","A\"​B"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]}
{"rows":[["id","note"],["1","A\"B"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]}

Measure parsed fields instead of splitting lines

Each fixture contains a header and one data record. Our observer recognizes doubled quotes and tracks quoted fields, so an LF inside quotes remains part of the note rather than creating an extra record. The comma fixture keeps its comma, the newline fixture keeps its embedded LF and the escaped-quote fixture keeps its literal quote after parsing. Cleanup removes U+200B from each note. The record count and two-field shape stay the same, while the exact data-field string changes. This distinction matters when validating an import.

The parser has a deliberately narrow scope

RFC 4180 provides the CSV quoting model linked below. Our helper supports the specific locally authored balanced fixtures, treats CRLF and LF outside quotes as record separators and reports quote balance. It is not a production CSV library, a full conformance test or a malformed-input validator. The embedded LF example records the helper behavior and does not assert strict RFC acceptance of every newline convention. This page concerns data fields, independently of the header matching problem covered in our existing CSV guide.

Verify the destination parser and field meaning

Keep the original file and import both versions using the destination CSV library. Compare record counts, field counts and exact data-field values, especially around quoted line breaks and doubled quotes. Review whether joining characters inside a note changes its intended words. A unchanged schema alone cannot establish semantic preservation. The homepage treats the source as plain text and does not parse CSV. These three fixtures establish quoting preservation for this callback and helper, without promising compatible behavior in every spreadsheet or importer.

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

CSV records and quoting 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.