How to find invisible characters in Arabic text
Some characters never show on screen but are still part of the text: special spaces, direction marks, and characters that block or force the joining of letters. They cause problems that are hard to explain: a copied word that search cannot find, a username a website rejects, two texts that look identical but fail a comparison, or punctuation that jumps to the other end of the line.
This tool shows each invisible character where it sits, with its official Unicode name and its position in the text. It deletes nothing; you decide what to do once you know what is there.
How to use it
- Paste your text into Original text, or click Try an invisible-text example to see one.
- Read the status line. It gives the number of code points in the text, which is its number of characters, and the number of characters to inspect. Ordinary spaces and line breaks are not included in that second number.
- In the preview below the box, each invisible character appears as a small badge with its short name, such as ZWSP or NBSP, exactly where it sits between the letters.
- Check the table and its three columns: Position / UTF-16, Character and Name / bidi / joining. To list every character in the text, tick Show all characters (first 300).
- To keep a record, open Copyable text report and copy or download the report.
- If you decide to remove something, go to the Cleaner and pick the matching option, such as Remove zero-width space & BOM, Convert non-breaking spaces or Remove direction controls from result.
Worked examples from the tool
الرياZWSPض- U+200B · ZERO WIDTH SPACE · Position 6
Settings: Invisible text · characters to inspect only
السعرNBSP25NBSPد.ك
- U+00A0 · NO-BREAK SPACE · Position 6
- U+00A0 · NO-BREAK SPACE · Position 9
Settings: Invisible text · characters to inspect only
میZWNJخواهم- U+200C · ZERO WIDTH NON-JOINER · Position 3
Settings: Invisible text · characters to inspect only
The usual suspects
| Name in the tool | What it is | Remove it? |
|---|---|---|
| ZWSP | A zero-width space that allows a line break without showing. | Usually yes, especially inside words. |
| NBSP | A space that keeps the next word on the same line; common in web pages. | Convert it to an ordinary space if it breaks search or matching. |
| RLM, LRM, ALM | Direction marks that control where numbers and punctuation sit next to Arabic. | Carefully: the display order can change once they are gone. |
| ZWNJ | Stops two neighbouring letters from joining; part of Persian spelling in words like میخواهم. | Not in Persian text. |
| ZWJ | Forces joining and glues the parts of some emoji into one symbol. | Not inside emoji. |
| BYTE ORDER MARK | A marker at the start of some text files that can stick to the first word or the first CSV column. | Yes, unless the program reading the file needs it. |
| SHY | A soft hyphen that only shows if the line breaks at that point. | Yes, in ordinary text. |
For more on each type and when it is useful, read the invisible characters guide.
Position versus UTF-16 position
Counting starts at 1. The first number is the character's position among code points: each character counted once, with a vowel mark counting as its own character. The second is its position in UTF-16 units, the storage units that programming languages such as JavaScript use. The two match in ordinary Arabic text and drift apart after most emoji, because an emoji takes two units. If you are a developer, use the second number and subtract 1, since string indexes in code start at zero.
Limits
- Up to 20,000 text units. The table shows the first 300 rows and the preview the first 2,000 code points, while the totals cover the whole text.
- The tool identifies characters but never removes them, and it cannot tell why they were put there.
- Visible look-alike letters, such as Arabic ي and Persian ی, are not invisible characters, so they are not among the characters to inspect. Tick Show all characters to see every letter's name.
- Characters outside the bundled data, such as emoji and most accented Latin letters, are shown as Outside this dataset subset.
- Names and properties come from Unicode 18.0.
Frequently asked questions
I copied a word from a website and search cannot find it. Why?
It probably contains a hidden character such as a ZWSP or a soft hyphen, or a non-breaking space instead of an ordinary one. Paste the word here to see the character and its position, then remove it in the Cleaner.
Should I delete every invisible character?
No. ZWNJ is part of Persian spelling, ZWJ holds some emoji together, and direction marks may have been added on purpose to keep a phone number or currency sign in place. Remove only what you know is unwanted.
Why does the position differ from the UTF-16 position?
The first counts characters; the second counts the storage units that programming languages use. Most emoji are one character stored as two units, so the second number gains one after each of them.
Does it detect a Persian yeh or keheh?
Not as invisible characters, because they are visible letters. Tick Show all characters (first 300) to see each letter's name, such as ARABIC LETTER FARSI YEH, or look them up in the character explorer.
Does the tool change my text?
No. It only reads the text and reports what it finds; what you pasted stays as it is. Removal happens in another tool, and only when you choose it.
