← All tools
Free tool · Local processing

Unicode Cleaner

Clean eight specific Unicode character types, with your original text kept alongside the result. Review the rules before applying them; joiners are preserved by default.

Cleaning rules

All eight characters can have legitimate uses. Uncheck a rule to preserve that character. Joiners and non-joiners can be essential to writing systems and emoji; their removal is off by default. Removing the word joiner can also change line wrapping.

Before

0 / 20,000 UTF-16 units

Cleaning runs only when you ask, in this tab. No text is sent or saved. The limit counts UTF-16 units; an astral emoji uses two. Long pastes are never cut.

After

Your cleaned text will appear here. The original stays in the Before panel.

Enter text, then choose Clean Unicode.

Targeted cleanup, not a Unicode reset

By default, zero-width spaces, byte-order marks and soft hyphens are removed. Non-breaking spaces become ordinary spaces, and line separators become newlines. The other three types are preserved unless you opt in.

Even these characters can be intentional. This tool does not remove accents, transliterate writing systems, normalize NFC or NFKC, or change quotes and dashes. It does not clean every Unicode character or detect AI writing.

Characters removed and characters replaced are separate occurrence counts. Changing a rule or editing the original clears the result until you clean again.

Before and after, default options

Three texts cleaned with the default options by this page’s own code. In the Before pane, each of the eight tracked characters is shown as ▯ so you can see where it was; the After pane is the exact output.

Removed: byte-order mark, zero-width space, soft hyphen
Before
▯Please send the▯ final draft by Fri▯day.
After
Please send the final draft by Friday.
Characters removed
3
Characters replaced
0

The byte-order mark at the start, the zero-width space after “the” and the soft hyphen inside “Friday” go. Nothing visible changes, and an exact search for “Friday” or “the final” now matches.

Replaced: non-breaking spaces and a line separator
Before
Ask Mr▯Smith: the order is 1▯000 units.▯Ship by Friday.
After
Ask Mr Smith: the order is 1 000 units.
Ship by Friday.
Characters removed
0
Characters replaced
3

Each non-breaking space becomes an ordinary space, the thousands separator in 1 000 included: the cleaner cannot tell an intentional one apart, so “1” and “000” may now wrap onto separate lines. Uncheck that rule to keep them. The line separator becomes a newline.

Preserved: an emoji joiner and a Persian non-joiner
Before
The 👩▯💻 emoji and the Persian word می▯خواهم.
After
The 👩‍💻 emoji and the Persian word می‌خواهم.
Characters removed
0
Characters replaced
0

The zero-width joiner holds 👩‍💻 together, and the zero-width non-joiner keeps the Persian word می‌خواهم (“I want”) correctly shaped. Both stay unless you check their rules.

The eight rules

Each of the eight characters has its own checkbox. These are the defaults, and the reason for each one. The cleaner does nothing else: it does not normalize to NFC or NFKC, change quotes, dashes or ellipses, replace look-alike letters, or merge and trim spaces.

Default action of each cleaning rule, and the reason for it
CharacterBy default, and why
Zero-width spaceU+200BRemovedRenders nothing but splits a word for search and counting. Uncheck it for scripts such as Thai or Khmer, where it can mark word boundaries.
Zero-width non-joinerU+200CPreserved unless checkedBreaks a cursive join or ligature on purpose. Persian and other scripts need it inside words.
Zero-width joinerU+200DPreserved unless checkedJoins glyphs and holds emoji sequences such as 👩‍💻 together. Removing it splits them.
Word joinerU+2060Preserved unless checkedPrevents a line break and leaves no visible trace. Removing it can change where lines wrap.
Byte-order markU+FEFFRemovedA file signature. Unicode discourages every other use, so inside a text it has no job.
Soft hyphenU+00ADRemovedRenders only at a line break, so it hides in plain sight and splits the word for search. Removing it also drops that hyphenation point.
Non-breaking spaceU+00A0Replaced with a spaceLooks like a space, so a typed space never matches it. It becomes an ordinary space rather than nothing, so words stay apart, but pairs such as 10 km or 1 000 can then wrap.
Line separatorU+2028Replaced with a newlineForces a line break; legal, but rare in text a person typed. It becomes a newline, so the break stays where it was.

Frequently asked questions

How is cleaning different from detecting invisible characters?

The detector only identifies recognized characters. Unicode Cleaner creates a separate output using your selected rules. It handles the same eight character types; it does not normalize all Unicode, transliterate letters or remove every unusual character. It does not read or remove a statistical AI watermark, which is a pattern in word choice and not a character.

What do the default cleaning options change?

By default, zero-width spaces, byte-order marks and soft hyphens are removed, non-breaking spaces become ordinary spaces, and line separators become newlines. Zero-width joiners, non-joiners and word joiners stay unless you opt in to removing them. Those characters can affect letters, emoji and line breaks, so review each option.

Will cleaning overwrite my original or copy text automatically?

No. Your input stays in the original field while the output and change counts show the selected transformations. Review both before choosing Copy result. Processing stays in your browser, and opening another tool or the editor does not transfer your text.

Related reading

In the AI watermark database

ChatGPT watermarkMarked in part
Grok watermarkNot marked

Want to polish a draft?

Open the editor to review writing suggestions. Your text is not transferred.

Open GenPolish