Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does TextDecoder("latin1") return a euro sign for byte 80?

In our runtime, the latin1 label resolves to windows-1252. Byte 80 decodes to a euro sign. Cleaning repairs an interrupted label but does not change that alias or inspect the original file encoding.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked encoding label

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.

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
Marked encoding label
direct string / keep / invisible true
"la​tin1"
U+006C U+0061 U+200B U+0074 U+0069 U+006E U+0031
"latin1"
Removed 1 invisible character
{"accepted":false,"errorName":"RangeError"}
{"accepted":true,"resolvedEncoding":"windows-1252","decoded":"€‘ "}
Latin1 label
direct string / keep / invisible true
"latin1"
U+006C U+0061 U+0074 U+0069 U+006E U+0031
"latin1"
No selected invisible characters found
{"accepted":true,"resolvedEncoding":"windows-1252","decoded":"€‘ "}
{"accepted":true,"resolvedEncoding":"windows-1252","decoded":"€‘ "}
Explicit Windows label
direct string / keep / invisible true
"windows-1252"
U+0077 U+0069 U+006E U+0064 U+006F U+0077 U+0073 U+002D U+0031 U+0032 U+0035 U+0032
"windows-1252"
No selected invisible characters found
{"accepted":true,"resolvedEncoding":"windows-1252","decoded":"€‘ "}
{"accepted":true,"resolvedEncoding":"windows-1252","decoded":"€‘ "}
UTF8 control
direct string / keep / invisible true
"utf-8"
U+0075 U+0074 U+0066 U+002D U+0038
"utf-8"
No selected invisible characters found
{"accepted":true,"resolvedEncoding":"utf-8","decoded":"���"}
{"accepted":true,"resolvedEncoding":"utf-8","decoded":"���"}

Record the resolved decoder instead of trusting the label name

The observer supplies the same three bytes, 80, 91 and A0, to every accepted decoder. An interrupted latin1 label is rejected with RangeError before cleanup, then resolves to windows-1252 after deletion. The plain latin1 and explicit windows-1252 controls resolve identically and decode the same euro sign, opening single quote and nonbreaking space. The UTF-8 reference accepts its label but produces three replacement characters from these bytes under its default error policy. The returned encoding field accompanies decoded text in the table. These measurements concern label resolution and interpretation of a fixed byte buffer, rather than identifying the encoding of a real uploaded file.

This alias differs from outbound Latin1 encoding

Our previous Buffer Latin1 article begins with Unicode text and writes bytes, where information can be lost. Here the direction is incoming bytes to text through TextDecoder. The label spelling belongs to that API’s supported names and aliases; it should not be treated as a generic promise about every library called Latin1. The homepage receives only the label string in this experiment. The synthetic byte buffer is constructed independently in the observer and never submitted to the cleaner. No file picker, network charset header, encoding detector or browser-specific implementation is measured. The UTF-8 control illustrates an alternative policy, not a recommendation to switch encodings until a display looks plausible.

Retain original bytes and the producer’s encoding contract

When a file displays unexpected punctuation, preserve its original bytes, consult its declared encoding and record the decoder’s resolved name. A repaired label only allows this API construction; it does not prove the selected interpretation matches the producer. Our A0 observation also occurs after cleanup, so its newly decoded nonbreaking space cannot be judged from the label’s removal count. The reproducible data specifies exactly which bytes and runtime were used, making a comparison with another destination possible. It does not recover unknown intended text or enumerate every legacy-encoding alias. Verify the actual decoder in the application that reads the file before applying further text edits to its output.

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 Encoding 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.