autorenew

Die unsichtbaren Zeichen in deinem KI-Text

Du kopierst einen Absatz aus einem Chatfenster, fügst ihn in dein Redaktionssystem ein, und der Text sieht genau gleich aus. Byte für Byte ist er es meistens nicht.

Zeichen ohne Breite

Unicode enthält eine Reihe von Codepoints, die keinen Platz einnehmen und nichts darstellen. Sie existieren aus echten typografischen Gründen. U+200B ZERO WIDTH SPACE markiert eine Stelle, an der ein langes Wort umbrechen darf. U+200D ZERO WIDTH JOINER verbindet Emoji, und genau so entsteht ein Familien-Emoji aus mehreren Personen. U+FEFF war ursprünglich eine Byte-Order-Markierung.

Weil sie nichts darstellen, überleben sie auch fast jedes Kopieren und Einfügen, ohne dass es jemand bemerkt. Das macht sie zu einem bequemen Kanal für alles, was mit einem Text mitreisen, aber darin nicht zu sehen sein soll.

Der Tags-Block

Der interessanteste Bereich reicht von U+E0000 bis U+E007F, dem Unicode-Tags-Block. Jeder Codepoint darin spiegelt ein druckbares ASCII-Zeichen: U+E0041 entspricht A, U+E0061 entspricht a, und so weiter.

Die Folge lohnt es, langsam auszusprechen: jede beliebige ASCII-Zeichenkette lässt sich in Tags-Zeichen umkodieren, an einen sichtbaren Satz anhängen und wird dabei vollständig unsichtbar, ohne ihre Rekonstruierbarkeit zu verlieren. Eine Sitzungs-ID, ein Kontoname, ein Zeitstempel. Der Text sieht sauber aus und trägt einen Fingerprint.

Bidi-Steuerzeichen

Eine dritte Gruppe nimmt keinen Platz ein, sondern ändert die Leserichtung: U+202E RIGHT-TO-LEFT OVERRIDE und Verwandte. In Prosa sind sie meist harmlose Überreste aus einer Vorlage mit mehreren Schriftsystemen. In einem Dateinamen oder einem Bezeichner können sie Text in einer anderen Reihenfolge anzeigen als er gespeichert ist, und das ist die Grundlage einer bekannten Klasse von Täuschungstricks.

Sie sichtbar machen

Man kann nicht reparieren, was man nicht sieht, und kein üblicher Editor zeigt sie an. Drei praktische Wege:

  1. Direkt nach dem Codepoint suchen. Die meisten Editoren akzeptieren \x{200B} oder Ähnliches in einer Regex-Suche.
  2. Den Text durch etwas leiten, das Codepoints statt Glyphen ausgibt.
  3. Ihn in ein dafür gebautes Werkzeug einfügen, etwa den Cleaner auf unserer Startseite, der jeden gefundenen Codepoint mit Namen auflistet und zeigt, an welcher Stelle im Text er saß.

Was entfernen und was behalten

Nicht jedes unsichtbare Zeichen ist Müll, und ein Cleaner, der alle entfernt, irrt auf eine Weise, die Nutzer bemerken.

U+FE0F VARIATION SELECTOR-16 ist der Unterschied zwischen einem roten und einem einfarbigen Herz. Ein Joiner zwischen zwei Piktogrammen hält ein Emoji zusammen. Entfernt man sie, hat man sichtbaren Inhalt im Namen der Sauberkeit zerstört.

Deshalb ist die Regel unserer Engine enger als “unsichtbare Zeichen entfernen”. Sie entfernt den Tags-Block bedingungslos, entfernt Zero-Width- und Formatzeichen in Prosa und lässt einen Joiner in Ruhe, wenn auf beiden Seiten ein Piktogramm steht. Alles Übrige meldet sie, statt es zu löschen.