TextWash

This page cleans whole batches of files: drop up to 50 together to get a per-file table of what’s hiding in each, then download every file cleaned as one zip. The sample below is a single translation-delivery string file — drop your own files to open the batch table. Everything runs in your browser — nothing is uploaded.

Input

X-ray hover a highlight for details

Cleaned output copied ✓

Cleaning rules

One file is easy. A folder of them is the actual job.

Hidden-character problems rarely arrive one file at a time. A translation agency delivers thirty .json / .po / .strings / .srt files at once. An export job writes a directory of CSVs. A docs repo has fifty Markdown files that have all been through the same copy-paste pipeline. Checking them one by one is exactly the kind of chore that doesn't get done — so drop them all together instead: up to 50 files, 5 MB each, 50 MB per batch.

Where batch junk comes from

Localization deliveries are the classic case. Strings that travelled through browser-based CAT editors pick up zero-width spaces mid-word; French and German translations legitimately use non-breaking spaces and narrow no-break spaces; word-processor round-trips leave curly quotes inside what should be machine-readable JSON; and tools disagree about byte-order marks, so half the files have one and half don't. A folder of CSV exports has its own well-known problems — same characters, different fallout.

What it breaks

One curly quote in one of thirty JSON files and the build fails with Unexpected token — the error names a byte offset, not the invisible character that caused it. A BOM at the top of a UTF-8 config makes some parsers choke on the very first key. A zero-width space inside a subtitle line renders as a visible tofu box on some players. And two files can print identically while comparing different, so the bug report says "works here."

How the batch table works

Drop the files together (or use Open file and multi-select). You get one row per file: detected encoding, size, and a findings summary — how many invisible characters, exotic spaces, curly quotes, dashes and other flagged characters it contains. Click any row to inspect that file character-by-character in the x-ray. "Download all clean (.zip)" applies your current rule toggles to every file and saves name.clean.ext copies in one zip. Files that use CRLF line endings keep them; UTF-16 files are saved back as UTF-8, and the table says so. Files that look binary are flagged and left out of the zip rather than mangled.

Honest limits

The rule toggles are one set for the whole batch — you can't clean file A with different rules than file B in a single pass. And "flagged" doesn't mean "wrong": if you're shipping French UI strings, the non-breaking spaces before ! and ? and the narrow spaces inside 1 299,00 are correct French typography, not junk — untick the exotic-spaces rule and use the table as an audit instead of a blanket wash. The same goes for ZWNJ/ZWJ in Persian, Arabic and Hindi text, where they're doing real work. Finally, this is a text tool: .docx and .xlsx are zip containers, not text — they'll be flagged as binary. Export to plain text or CSV first (see text copied from Word).

Is it private?

Yes. Every file is read and cleaned locally in your browser — nothing is uploaded, which matters when the batch is a client's unreleased product copy or a legal document set. Load the page, go offline if you like, then drop the folder's contents.