Was Text eigentlich ist und warum Tools sich darüber uneinig sind
Eine Textdatei besteht aus Bytes plus einer Kodierung, und die Kodierung steht nicht in der Datei. Nur eine Konvention sagt einem Programm, dass ein bestimmtes Byte „é“ bedeutet – deshalb öffnet sich dieselbe Datei an einer Stelle korrekt und an einer anderen als „é“. UTF-8 ist die moderne Antwort und speichert gängige lateinische Buchstaben in einem Byte, Buchstaben mit Akzent oder Umlaut in zwei und den Großteil von Chinesisch, Japanisch, Arabisch sowie jedes Emoji in drei oder vier. UTF-16 nutzen Windows und JavaScript intern; es speichert fast alles in zwei Bytes und den Rest in vier. Windows-1252 und Latin-1 sind die Ein-Byte-Kodierungen, die ältere Systeme noch erzeugen, und die übliche Ursache für Zeichensalat. Gut zu wissen über diese Seiten: Der CSV-Viewer erkennt die Kodierung einer abgelegten Datei, auch UTF-16 und Windows-1252, und lässt Sie sie ändern. Die einfachen Textfelder tun das nicht – eine abgelegte Datei wird als UTF-8 gelesen, ein Latin-1-Export zeigt seine Sonderzeichen also falsch an, und die Lösung ist, ihn zuerst umzuwandeln.
„Zeichen“ hat vier Bedeutungen, und welche Sie brauchen, hängt davon ab, wer die Grenze setzt. Was ein Mensch als ein Zeichen sieht, ist ein Graphem-Cluster. Was ein regulärer Ausdruck erfasst, ist ein Codepoint. Was string.length in JavaScript meldet, sind UTF-16-Einheiten. Was eine Datenbankspalte oder ein HTTP-Header misst, sind UTF-8-Bytes. Bei einfachem englischem Text stimmen alle vier überein, deshalb fällt es niemandem auf – und dann ist ein Familien-Emoji ein Graphem, sieben Codepoints, elf UTF-16-Einheiten und fünfundzwanzig Bytes, und eine Nachricht mit 200 Zeichen wird von einem Feld für 255 Zeichen abgelehnt. Genau deshalb zeigt Zeichen zählen alle vier an.
Unsichtbare Zeichen sind echte Zeichen. Ein geschütztes Leerzeichen sieht genauso aus wie ein normales und ist ein völlig anderes Zeichen – es kommt ständig mit Text, der von einer Webseite oder aus einer Textverarbeitung kopiert wurde, und bringt Suchen, CSV-Parsing und Code durcheinander, der an Leerzeichen trennt. Nullbreite Verbinder halten ein Emoji mit mehreren Personen zusammen. Weiche Trennstriche, Richtungsmarkierungen und Byte-Order-Marks reisen mit eingefügtem Text mit. Keines davon ist auf dem Bildschirm zu sehen, das einzige Signal ist also eine Zählung, die nicht zu dem passt, was Sie sehen – ein ehrlicher Einsatzzweck für einen Zeichenzähler. Beachten Sie: Die Option „Alle Leerzeichen ignorieren“ in Texte vergleichen fasst normale Leerzeichen und Tabs zusammen; ein geschütztes Leerzeichen behandelt sie nicht als Leerzeichen, denn es ist keines.
Zeilenenden sind der Grund, warum ein Diff manchmal jede Zeile als geändert anzeigt. Windows beendet eine Zeile mit Wagenrücklauf und Zeilenvorschub; alle anderen nur mit Zeilenvorschub. Speichern Sie eine LF-Datei in einem Windows-Editor, unterscheidet sich jede Zeile um ein unsichtbares Byte – ein Vergleich auf Byte-Ebene wie git diff oder diff(1) meldet dann die ganze Datei als neu geschrieben und verdeckt die eine Änderung, die Sie tatsächlich gemacht haben. Texte vergleichen und Doppelte Zeilen entfernen trennen vor dem Vergleich nach allen drei Konventionen, eine Datei, deren Zeilenenden sich nur geändert haben, erscheint hier also nicht als rote Wand. In einem Lesewerkzeug ist das bequem, in einem Repository eine Falle: Beheben Sie es an der Quelle, mit Ihrem Editor oder den Zeilenende-Einstellungen von git.
Zwei identisch aussehende Strings können beim Vergleich verschieden sein, und meist liegt es an der Normalisierung. Unicode kann „é“ auf zwei Arten schreiben: als einen Codepoint oder als einfaches „e“, gefolgt von einem kombinierenden Akut. Beide sehen gleich aus und sind unterschiedliche Bytefolgen, sodass ein Vergleich, eine Deduplizierung oder eine Datenbankabfrage sie als zwei verschiedene Werte behandelt. macOS und Windows waren sich lange uneinig, welche Form sie für Dateinamen verwenden – so entsteht aus einer Liste, die auf zwei Rechnern gesammelt wurde, eine Liste mit scheinbar exakten Duplikaten, die sich nicht entfernen lassen. Mit Zeichen zählen erkennen Sie das: Beide Formen haben dieselbe Graphem-Anzahl und eine unterschiedliche Codepoint-Anzahl. Keines dieser Tools wandelt zwischen den Formen um; das erledigt eine Zeile in einem Skript mit einer Unicode-Bibliothek, etwa unicodedata.normalize in Python.
„Wortanzahl“ ist eine Ermessensfrage, keine Messung. Das Trennen an Leerzeichen ist eine Regel des Englischen, und auf Chinesisch, Japanisch oder Thai angewendet – Sprachen ohne Leerzeichen zwischen Wörtern – meldet sie einen langen Artikel als ein einziges Wort. Unser Zähler nutzt stattdessen die Unicode-Wortsegmentierung des Browsers, die in jeder Schrift weiß, wo Wörter beginnen. Die übrigen Abweichungen betreffen Bindestriche („well-known“ ist hier und in Word ein Wort, in manchen Tools zwei), alleinstehende Zahlen und die Frage, was als Satz gilt – „Wir trafen Dr. Schmidt“ ist ein Satz, und ein naiver Satztrenner macht zwei daraus. Die Lesezeit ist eine weitere Schätzung obendrauf: 238 Wörter pro Minute beim stillen Lesen, aus einer Metaanalyse statt der runden Zahl, die von Blogartikel zu Blogartikel kopiert wird.
Wo ein Browser wirklich das falsche Werkzeug ist
Nichts in diesem Bereich wird je gesendet oder gespeichert – deshalb können Sie hier bedenkenlos einen unveröffentlichten Entwurf oder proprietären Quellcode einfügen. Das legt aber auch die Obergrenze fest, und wir sagen lieber, wo sie liegt, als dass Sie es mitten in der Arbeit herausfinden.
Große Dateien. Der gesamte Text liegt im Speicher des Tabs und wird bei jeder Eingabe neu untersucht. Ein paar Megabyte gehen bequem; eine Logdatei mit mehreren hundert Megabyte nicht, und ein Smartphone gibt früher auf als ein Laptop. Die Kommandozeile hat dieses Problem nicht, weil sie streamt: grep und ripgrep durchsuchen Dateien, die größer sind als Ihr Arbeitsspeicher, sed und awk verarbeiten sie Zeile für Zeile, und sort mit der Unique-Option entfernt Duplikate aus einer Liste mit zig Millionen Zeilen, indem es auf die Festplatte auslagert. All das ist kostenlos und auf macOS und Linux bereits installiert.
Sehr unterschiedliche Dokumente. Texte vergleichen hört bei 8.000 Unterschieden auf, weil der Speicherbedarf des Algorithmus danach so schnell wächst, dass der Tab einfriert – und ein so großer Diff ist ohnehin unlesbar. Zwei Versionen desselben Dokuments erreichen die Grenze fast nie, zwei unabhängige Dokumente sofort. Für Code-Reviews bewältigen diff und git diff jede Größe, und ein richtiges Drei-Wege-Merge-Tool kann etwas, das diese Seite überhaupt nicht kann.
Kodierung ändern oder Unicode normalisieren. Diese Seiten lesen und berichten; zwischen Kodierungen wandeln sie nicht um. iconv wandelt zwischen allen existierenden Kodierungen um, der Befehl file errät, was Sie vor sich haben, und Unicode-Normalisierung ist eine Zeile Python oder ein Aufruf von uconv aus ICU. Wenn Sie einen Export mit Zeichensalat reparieren, ist das Ihre Werkzeugkette.
Alles Wiederkehrende. Diese Tools laufen, wenn jemand klickt. Wörter in vierhundert Dokumenten zählen oder ein Verzeichnis bei jedem Commit minifizieren gehört in ein Skript oder einen Build-Schritt – und speziell beim Minifizieren erledigt Ihr Build-Tool dasselbe, mit Source Maps, Watch-Modus und Caching, die ein Einfügefeld nicht bieten kann. Diese Seite ist für die eine Datei, die Sie gerade vor sich haben.
Modernes CSS. CSS minifizieren lehnt natives Nesting und die moderne Bereichssyntax für Media Queries ab, statt sie zu minifizieren, weil der zugrunde liegende Minifizierer älter ist als beides und stillschweigend löscht, was er nicht versteht. Das ist eine ehrliche Ablehnung, kein Feature, und die Lösung ist, das Nesting zuerst mit Sass, PostCSS oder Lightning CSS wegzukompilieren – was Ihr Build-Tool mit ziemlicher Sicherheit ohnehin tut.
Die Wahl zwischen ähnlich klingenden Tools
Wörter zählen oder Zeichen zählen? Dieselbe Zählung mit anderen Hauptzahlen. Wörter zählen zeigt zuerst Wörter, Sätze, Absätze und Lesezeit – das Maß für einen Aufsatz, einen Artikel oder eine Rede. Zeichen zählen zeigt zuerst Zeichen, Zeichen ohne Leerzeichen und UTF-8-Bytes – das Maß für eine Meta-Description, ein SMS-Segment oder ein Datenbankfeld. Wenn etwas Ihren Text als zu lang abgelehnt hat, brauchen Sie den Zeichenzähler und dort konkret die Byte-Anzahl.
Texte vergleichen oder Doppelte Zeilen entfernen? Der Vergleich beantwortet „Was hat sich zwischen diesen beiden Versionen geändert?“ und braucht zwei Texte. Doppelte Zeilen entfernen arbeitet mit einer Liste und beantwortet „Was kommt hier mehr als einmal vor?“. Es zeigt Ihnen außerdem, welche Einträge sich wiederholt haben und wie oft, sortiert natürlich, sodass item2 vor item10 kommt, oder behält nur die Zeilen, die genau einmal vorkamen. Die Einträge zu finden, die nur in einer von zwei Listen stehen, ist Aufgabe von Doppelte Zeilen entfernen, nicht des Vergleichs.
HTML minifizieren, CSS minifizieren oder JavaScript minifizieren? Drei Sprachen, drei Minifizierer und eine Überschneidung, die man kennen sollte: Der HTML-Minifizierer minifiziert auch das CSS in style-Blöcken und das JavaScript in script-Blöcken, genauso wie die anderen beiden Seiten. Eine einzelne HTML-Datei braucht also ein Tool, nicht drei. Separate .css- und .js-Dateien brauchen ihre eigenen Seiten.
XML-Viewer oder XML formatieren und XML-Validator? Der Viewer hier bietet Ihnen einen einklappbaren Baum zum Erkunden – genau das Richtige, wenn das Dokument groß ist und Sie etwas suchen. Formatierer und Validator bei den Entwickler-Tools liefern eingerückten Text, den Sie zurück in eine Datei kopieren, und die genaue Zeile und Spalte eines Fehlers. Lesen einerseits, Bearbeiten und Reparieren andererseits.
CSV-Viewer oder die Datei in Excel öffnen? Kein konkurrierendes Tool, aber genau diesen Vergleich stellen die Leute tatsächlich an. Excel wandelt beim Öffnen um, ohne zu fragen: Ein Produktcode 00123 wird zu 123, eine Teilenummer 5-3 zum 5. März, eine lange Bestellnummer landet in wissenschaftlicher Notation, und ein Export mit Kommas als Trennzeichen aus einem englischsprachigen System landet komplett in Spalte A. Der Viewer zeigt jeden Wert als Text, genau wie er gespeichert ist, sodass Sie sehen, was man Ihnen tatsächlich geschickt hat.
Markdown-Vorschau oder Markdown in PDF? Die Vorschau dient dazu, live beim Tippen zu prüfen, ob eine README so dargestellt wird, wie GitHub sie darstellen wird. Markdown in PDF bei den Dokument-Tools erzeugt ein fertiges Dokument mit Seitenumbrüchen. Hier prüfen, dort veröffentlichen.