I think what you’re missing is that your font doesn’t have a glyph for the character, so shows the ? in a box.

My font, DejaVu Sans Mono, has a glyph for that character, which is a zero-width glyph, so you cannot see it (because it’s there, but zero-width). But I can highlight it (see the little green highlight on the first line, and the “Sel: 1|1” on the status bar.

@Nathan-Harvey , I think Notepad++ and my font are doing the right thing: there is a character (Zero-Width Space), and it is being shown, as zero-width. It’s not a control-character, so it doesn’t have a default CRLF-style box-glyph from show-all-characters.

However, using the PythonScript plugin (that Claudia’s screenshot implied), you can run editor.setRepresentation(u'\u200B', "ZWS") to get it to replace the normal zero-width space with ZWS in a black box (similar to the CR and LF boxes). To clear that alternate representation, editor.clearRepresentation(u'\u200B'). (There is similar notation for the NppExec plugin as well, but I do not know how to represent a unicode string in its syntax.)

By saving that to a script, and using the PythonScript Configuration menu to add that script to the Plugins > PythonScript menu, you can actually then assign a keyboard shortcut using Settings > Shortcut Mapper > Plugin Commands. If you make two scripts

Peter, thank you very much for your insight.
You could be and I already start thinking you are right about the glyph and my used font.
I still feel it should be the other way around as I don’t like to have an invisible char in my code
and wondering why it doesn’t do what it is supposed to do but than, on the other side, it doesn’t make sense to have a zero-width char. Hmmm.
I guess I’m good as I can use my font or using setRepresentation function to see any “invisible” chars :-)
Your explanation makes sense - absolutely.

Also, if you want one command to do the normal Show All Characters plus showing these four Zero Width characters,

# script = Show All Characters (including ZeroWidth)
editor.setRepresentation(u'\u200B', "ZWS")
editor.setRepresentation(u'\u200C', "ZWNJ")
editor.setRepresentation(u'\u200D', "ZWJ")
editor.setRepresentation(u'\uFEFF', "ZWNBSP")
# if you want to _also_ show all characters with this script,
# first pick a different View > Show Symbols option,
# then pick this one (each is a toggle, so don't want to accidentally hide all characters if show-all was already selected)
notepad.menuCommand(MENUCOMMAND.VIEW_EOL)
notepad.menuCommand(MENUCOMMAND.VIEW_ALL_CHARACTERS)

And similarly to un-set Show All Characters as well as clearing the four Zero Width representations:

# script = Don'tShow All Characters (including ZeroWidth)
editor.clearRepresentation(u'\u200B')
editor.clearRepresentation(u'\u200C')
editor.clearRepresentation(u'\u200D')
editor.clearRepresentation(u'\uFEFF')
# if you want to _also_ hide all characters with this script,
# first pick a different View > Show Symbols option,
# then pick this one twice (each is a toggle, so don't want to accidentally show all characters if show-all was already cleared)
notepad.menuCommand(MENUCOMMAND.VIEW_EOL)
notepad.menuCommand(MENUCOMMAND.VIEW_ALL_CHARACTERS)
notepad.menuCommand(MENUCOMMAND.VIEW_ALL_CHARACTERS)

As explained in my comments, I use the VIEW_EOL to change out of VIEW_ALL_CHARACTERS, no matter what the state of the VIEW_ALL_CHARACTERS toggle is; then I use VIEW_ALL_CHARACTERS once to set it or twice to clear it. If, instead, you’d like your DontShowAllCharacters to revert to “Show EOL” or “Show Whitespace and Tab”, then instead of VIEW_EOL/VIEW_ALL_CHARACTERS/VIEW_ALL_CHARACTERS sequence of three, you could just use VIEW_EOL (a sequence of one to show EOL) or VIEW_TAB_SPACE. (Though, to be safe, you might want a two-sequence of VIEW_ALL_CHARACTERS/VIEW_EOL or VIEW_ALL_CHARACTERS/VIEW_TAB_SPACE. It would be easier if there were a notepad.getMenuCommandState() or similar command that reads back the current state of a toggled menu command.)

thx,
there are editor.getViewEOL() and editor.getViewWS() functions available
to retrieve current state. But instead of using setView… I would recommend using
notepad.menuCommand(MENUCOMMAND…) to be in sync with notepad++ itself.