Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Does opening a UTF-8 file remove its initial BOM before cleaning?

In our recorded File.text tests, an initial UTF-8 BOM disappears during loading, while an interior U+FEFF remains until cleanup. The removal report counts the loaded string, not every byte in the file.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Initial UTF8 BOM

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
Initial UTF8 BOM
direct string / keep / invisible true
"AB"
U+0041 U+0042
"AB"
No selected invisible characters found
{"feffCount":0,"selectedCount":0}
{"feffCount":0,"selectedCount":0}
Interior BOM
direct string / keep / invisible true
"AB"
U+0041 U+FEFF U+0042
"AB"
Removed 1 invisible character
{"feffCount":1,"selectedCount":1}
{"feffCount":0,"selectedCount":0}
Initial and interior BOM
direct string / keep / invisible true
"AB"
U+0041 U+FEFF U+0042
"AB"
Removed 1 invisible character
{"feffCount":1,"selectedCount":1}
{"feffCount":0,"selectedCount":0}
Selected marker body
direct string / keep / invisible true
"A​B"
U+0041 U+200B U+0042
"AB"
Removed 1 invisible character
{"feffCount":0,"selectedCount":1}
{"feffCount":0,"selectedCount":0}

Loading precedes the clean button

The supplied preparation records contain byte arrays passed to File.text and the resulting strings. A file beginning EF BB BF followed by A and B loads as AB. The interior-BOM fixture begins with A, then the same three BOM bytes, then B: it loads with U+FEFF between the letters, and cleanup removes that character. A file with both positions loses its initial signature during loading and its interior U+FEFF during cleaning. A U+200B reference survives loading and is removed during cleaning. The separate records prevent the load stage from being silently credited to the cleaner.

The report concerns characters the callback receives

The homepage file-change handler assigns await file.text() to its source field. It does not count original bytes, choose a user-specified encoding or return an edited file. Our Node File API experiment records its runtime; the separately saved browser run checks the same API cases in the live page context. This differs from testing standalone TextDecoder options because the actual file-loading API selects its own UTF-8 behavior. These synthetic text files contain only known bytes. We did not test large files, legacy encodings, UTF-16 import or a browser file-picker upload to a remote service.

Keep byte evidence separate from edited text

When an import loses a signature, save the original file and compare its bytes with the loaded text before pressing Clean. Use the file-fixtures record to reproduce these specific cases, then test your destination importer with the intended encoding. An initial BOM not appearing in the removal count is compatible with its earlier handling by File.text. If preserving exact bytes matters, do not infer a reversible file transformation from a textarea result. This workflow processes decoded text and copying that text does not preserve every byte-level property of the original file or establish its authorship.

Reproduce this test

Node File.text load record · Independent browser load record. The reproducer recreates the byte fixtures and invokes File.text; use Node.js 24 or newer. 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

File API text decoding 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.