Text- und Alltagswerkzeuge · Text-Toolkit
Unsichtbare Zeichen: geschützte Leerzeichen, Verknüpfungen mit Nullbreite und Beschnitt
· Hintergrund
Textbereinigung Unicode Veröffentlichung
Untersucht die Zeichen, die wie nichts aussehen – geschützte Leerzeichen, Leerzeichen und Verknüpfungen mit der Breite Null, Byte-Reihenfolgemarkierungen – woher sie kommen, welche als Leerzeichen gelten und wie man sie findet und entfernt.
Zwei identische Zeilen, die keine Duplikate sind – wie ein unsichtbares Zeichen die Deduplizierung und Suche zunichte macht
Zwei Zeilen können in einem Editor identisch aussehen, bestehen jedoch keine Gleichheits-, Such- oder Deduplizierungsprüfungen. Einer kann ein gewöhnliches U+0020-Leerzeichen enthalten, während der andere U+00A0, ein geschütztes Leerzeichen, enthält. Ein Zeichen mit der Breite Null kann das gleiche Problem verursachen, ohne eine sichtbare Breite einzunehmen, sodass ein Herausgeber zwei scheinbar übereinstimmende Bezeichnungen hat, die jedoch unterschiedliche Zeichenfolgen bleiben.
Das ist nicht nur kosmetischer Natur. Versteckte Codepunkte können Analysedimensionen aufteilen, einen exakten Suchvorgang zunichte machen, eine doppelte Zeile beibehalten oder dazu führen, dass die Validierung eines kopierten Bezeichners fehlschlägt. Bevor Sie Inhalte nach Augenmaß umschreiben, bewahren Sie eine Kopie der Quelle auf und vergleichen Sie die verdächtigen Zeichenfolgen systematisch. Die sichtbare Darstellung ist ein Beweis für das Erscheinungsbild und kein Beweis dafür, dass die zugrunde liegenden Unicode-Sequenzen übereinstimmen.
Woher sie kommen – Webseiten, Textverarbeitungsprogramme, Emoji-Sequenzen und Kopieren und Einfügen aus PDFs
Unsichtbare Charaktere entstehen häufig durch normale Arbeit. Webseiten verwenden geschützte Leerzeichen, um Begriffe zusammenzuhalten, Textverarbeitungsprogramme behalten die Layout-orientierten Abstände bei und die PDF-Extraktion rekonstruiert Text aus positionierten Glyphen. Beim Kopieren zwischen diesen Systemen können Formatierungszeichen in ein CMS-Feld übertragen werden, selbst wenn das Ziel nur bekannte Wörter und Lücken anzeigt.
Andere unsichtbare Markierungen sind absichtliche Teile von Schriftsystemen oder Emojis. Ein Joiner mit der Breite Null kann Emoji-Komponenten in einem angezeigten Symbol kombinieren, während Joiner und Nicht-Joiner die Formgebung in mehreren Skripten beeinflussen. Dieser Ursprung ist wichtig: „kann nicht gesehen werden“ bedeutet nicht „sicher zu löschen“. Die Bereinigung sollte auf ein diagnostiziertes Artefakt abzielen, nicht auf jedes Zeichen, dessen Vorschubbreite zufällig Null ist.
Die Leerzeichenfamilie – gewöhnliche, geschützte, schmale und ideografische Leerzeichen und was die JavaScript-Verordnung als Leerzeichen betrachtet
Unicode enthält mehr als den alltäglichen Speicherplatz. U+00A0 ist das geschützte Leerzeichen, U+202F ist das schmale geschützte Leerzeichen und U+3000 ist das ideografische Leerzeichen. Die JavaScript-Leerzeichenverarbeitung umfasst diese Zeichen, sodass `trim()`, `trimStart()` und `trimEnd()` sie entfernen können, wenn sie am relevanten Rand einer Zeichenfolge auftreten.
Das Zeilenkürzen des Text Toolkits ruft diese JavaScript-Methoden in jeder Zeile auf. Der Innenabstand wird nicht normalisiert, sodass zwischen zwei Wörtern ein geschütztes Leerzeichen verbleibt. Seine Statistik „Zeichen ohne Leerzeichen“ entfernt Zeichen, die mit JavaScript `s` übereinstimmen, das breiter als ASCII-Leerzeichen ist. Verwenden Sie diese Zahl als definiertes Maß und nicht als Versprechen, dass jeder unsichtbare Codepunkt ausgeschlossen wurde.
Die Null-Breite-Familie – Leerzeichen mit Null-Breite, Joiner und Nicht-Joiner, Wort-Joiner und die Byte-Reihenfolge-Marke, die überhaupt keine Leerzeichen sind
Die Familie mit der Breite Null folgt anderen Regeln. U+200B-Leerzeichen mit Nullbreite, U+200C-Nicht-Joiner mit Nullbreite, U+200D-Joiner mit Nullbreite und U+2060-Wortjoiner sind Formatzeichen und keine JavaScript-Leerzeichen. Gewöhnliches `trim()` entfernt sie daher nicht. Eine Zeile mit einer dieser Markierungen ist nicht nur deshalb leer, weil auf dem Bildschirm keine Tinte angezeigt wird.
U+FEFF hat zwei verwandte Historien: Am Anfang codierter Daten kann es eine Bytereihenfolgemarkierung signalisieren, während es im Text als unterbrechungsfreier Leerraum mit Nullbreite diente. Im Gegensatz zu U+200B bis U+200D enthält ECMAScript U+FEFF in seinem Leerraumsatz. Die gesamte Familie der Nullbreiten als eine Art Leerzeichen zu behandeln, würde daher dem tatsächlichen JavaScript-Verhalten widersprechen.
Sie erkennen – verwenden Sie den Zeichenzähler, um Zählungen zu erkennen, die nicht mit dem übereinstimmen, was Sie sehen, und denken Sie daran, dass sich einige Joiner an einen Nachbarn anhängen und verborgen bleiben
Eine überraschende Zählung kann Sie auf versteckte Inhalte aufmerksam machen, aber nicht jeden Fall identifizieren. ToolAcre zählt Graphemcluster mit `Intl.Segmenter`, sofern verfügbar. Ein Joiner, der an einer Emoji-Sequenz teilnimmt, kann dazu beitragen, dass mehrere Codepunkte ein Graphem bilden. Das Hinzufügen oder Entfernen kann also das Rendering ändern, ohne dass die einfache Erhöhung um ein Zeichen entsteht, die ein Codepunktzähler anzeigen würde.
Verwenden Sie mehrere Hinweise zusammen: fehlgeschlagene exakte Übereinstimmungen, ein unerwartetes Ergebnis „ohne Leerzeichen“, kopierter Text, der in einem Unicode-fähigen Editor überprüft wurde, oder eine Regex-Suche nach bestimmten Codepunkten. Der Fallback-Zähler verwendet Codepunkte, wenn Segmenter nicht verfügbar ist, daher können die Ergebnisse auch je nach Browserfunktion unterschiedlich sein. Das Zählen engt die Ermittlungen ein; Es handelt sich nicht um einen Scanner für versteckte Zeichen oder einen Viewer für Unicode-Namen.
Erkennen versteckter Zeichen: Zählungen liefern Hinweise, keine vollständige Bestandsaufnahme
Arbeiten Sie für ein bestätigtes Kopier-und-Einfüge-Artefakt an einem Duplikat und öffnen Sie „Suchen und Ersetzen“ im Regex-Modus. Durch die Suche nach `[]` und das Ersetzen durch nichts werden Leerzeichen mit der Breite Null und eingebettete U+FEFF-Zeichen im gesamten Text entfernt. Das Tool kompiliert das Muster mit dem globalen Flag von JavaScript, meldet die Anzahl der Ersetzungen und lässt den Text unverändert, wenn das Muster ungültig ist.
Erweitern Sie dieses Muster nicht automatisch auf `[-]`. Der Bereich entfernt außerdem U+200C und U+200D, wodurch sich die Schriftform ändern und ein verbundenes Emoji in separate Symbole aufteilen kann. Fügen Sie diese Codepunkte nur hinzu, wenn die Überprüfung ergibt, dass sie unerwünscht sind. Führen Sie nach dem Ersetzen eine Deduplizierung durch und vergleichen Sie die Ausgabe mit dem erhaltenen Original, bevor Sie sie veröffentlichen.
Funktioniertes Beispiel: Entfernen Sie vor der Deduplizierung nur bestätigte unerwünschte Zeichen mit der Breite Null
Diese Bereinigung befasst sich nicht mit bidirektionalen Steuerzeichen, Homoglyphen oder allen Sicherheitsproblemen, die mit verwirrendem Text verbunden sind. Richtungsmarkierungen können die visuelle Reihenfolge verändern, während Homoglyphenangriffe verschiedene sichtbare Zeichen verwenden, die einander ähneln. Keines der beiden Probleme wird durch das Löschen von Leerzeichen gelöst, und ein wahlloser regulärer Ausdruck mit unsichtbaren Zeichen kann legitime mehrsprachige Inhalte beschädigen, während das eigentliche Risiko außer Acht gelassen wird.
Das Toolkit stellt außerdem keine Regex-Flags wie den Unicode- oder Mehrzeilenmodus bereit, hebt nicht jede bevorstehende Übereinstimmung hervor und geht die Ersetzungen nicht einzeln durch. Ersetzen Sie alle Vorgänge im gesamten Text, daher sind die gemeldete Anzahl und die Rückgängig-Aktion wichtige Schutzmaßnahmen. Überprüfen Sie bei Quellcode, legalen Kopien oder unbekannten Skripten jedes Zeichen mit einem speziellen Unicode-Tool, bevor Sie Massenbearbeitungen vornehmen.
Das Wichtigste: Unsichtbar bedeutet nicht harmlos; Der Zähler und die Regex-Suche und -Ersetzung des Text Toolkits machen sie sichtbar und entfernen sie, ohne Ihren Browser zu verlassen
Unsichtbar bedeutet nicht leer, austauschbar oder schädlich. Geschützte Leerzeichen sind Leerzeichen mit Layout-Semantik; Joiner mit der Breite Null können Formungssemantik übertragen. U+FEFF verhält sich beim JavaScript-Trimmen wieder anders. Eine genaue Bereinigung beginnt mit der Benennung des Codepunkts, dem Verständnis, warum er möglicherweise vorhanden ist, und der Entscheidung, ob das Ziel seine Funktion noch benötigt.
Verwenden Sie das Text Toolkit als kontrollierte browserseitige Workbench: Zählungen können eine Diskrepanz aufdecken, Regex-Suchen und Ersetzen kann einen genau definierten Satz entfernen und Deduplizierung kann bestätigen, dass versteckte Unterschiede verschwunden sind. Behalten Sie ein Original bei, vermeiden Sie standardmäßig das Löschen von Verknüpfungen und überprüfen Sie das gerenderte Ergebnis. Eine enge, überprüfbare Korrektur ist sicherer, als den gesamten unsichtbaren Unicode als Trümmer zu behandeln.