Warum arbeitet Windows 7 mit Unicode und nicht mit UTF-8?
Terminologie
Unicode und UTF-8 sind nicht dasselbe: Unicode ist ein Zeichensatz , der einen Zeichensatz (ein Repertoire) definiert und jedem dieser Zeichen Nummern (Codepunkte) zuweist. UTF-8 ist eine von mehreren Codierungen , die verwendet werden können , um vertreten einen Strom von Unicode - Zeichen auf der Festplatte oder in Transmission. Derselbe Stream von Unicode-Zeichen könnte beispielsweise auch als UTF-16, UTF-32 oder UTF-7 codiert werden.
Allerdings Notepad bietet „Codierung“ Optionen , einschließlich Sie ANSI
, Unicode
, Unicode big-endian
und UTF-8
. Die Microsoft-Entwickler, die dies geschrieben haben, haben die falschen Begriffe verwendet. Wenn sie "Unicode" sagen, meinen sie höchstwahrscheinlich " UTF-16
Little-Endian ". Wenn sie "ANSI" sagen, meinen sie Code Seite 1252 (CP-1252).
Microsoft Editor
Ich glaube, dass Microsoft's Notepad UTF-16 mit einer Bytereihenfolge ( BOM ) schreibt und dass Notepad beim Lesen einer Textdatei nach der Stückliste sucht. Die Stückliste teilt der App mit, dass die Datei UTF-16 ist, und gibt an, ob es sich um Big-Endian oder Little-Endian handelt.
Wenn Notepad die Stückliste nicht findet, ruft es eine Bibliotheksfunktion auf IsTextUnicode
, die die Daten überprüft und versucht, zu erraten, welche Codierung verwendet wurde. Manchmal (unvermeidlich) wird falsch geraten. Manchmal wird vermutet, dass eine "ANSI" -Datei "Unicode" ist. Wenn Sie versuchen, eine UTF-16- oder UTF-8-Datei als Code Page 1252-Datei zu interpretieren, werden die falschen Glyphen angezeigt, und es werden keine Glyphen zum Rendern einiger 8-Bit-Werte gefunden. Diese werden dann als Quadrate angezeigt.
Wie Harrymc in seiner Antwort sagt , gibt es bessere Alternativen zu Notepad. Mit Notepad können Sie jedoch die Codierung beim Öffnen einer Datei explizit auswählen (anstatt Notepad zu verlassen, um zu versuchen, dies zu erraten).
Byte Order Marks
Nach Angaben des Unicode-Konsortiums sind Byte Order Marks (BOMs) optional. Windows stützt sich jedoch auf Stücklisten, um zwischen einigen Codierungen zu unterscheiden.
Kurz gesagt, vielleicht fehlte Ihren Dateien aus irgendeinem Grund eine Stückliste? Vielleicht ist die Stückliste während des Upgrades verloren gegangen?
Wenn Sie immer noch die Originaldateien haben, die als Quadrate angezeigt werden, können Sie einen hexadezimalen Speicherauszug erstellen, um festzustellen, ob sie eine Stückliste enthalten.
Normale Textdateistandards
Das Problem ist, dass es praktisch keine gibt - keine universellen Standards für Nur-Text-Dateien. Stattdessen gibt es eine Reihe von Inkompatibilitäten und Unbekannten.
Wie wurden Zeilenenden markiert? Einige Plattformen verwenden die Steuerzeichen Carriage Return (CR), gefolgt von Line Feed (LF), andere verwenden CR und andere LF.
Sind die obigen Abschlusszeichen oder Trennzeichen? Dies wirkt sich am Ende einer Datei aus und verursacht bekanntermaßen Probleme.
Behandlung von Tabulatoren und anderen Steuerzeichen. Wir könnten annehmen, dass ein Tabulator verwendet wird, um ein Vielfaches von 8 Standardzeichenbreiten ab dem Beginn der Zeile auszurichten, aber es gibt wirklich keine Gewissheit darüber. In vielen Programmen können die Tabulatorpositionen geändert werden.
Zeichensatz & Kodierung? Es gibt keinen universellen Standard für die Angabe, welche davon für den Text in der Datei verwendet wurden. Das nächste, was wir haben, ist das Vorhandensein einer Stückliste, die angibt, dass die Codierung eine der für Unicode verwendeten ist. Anhand des Stücklistenwerts kann das Programm, das die Datei liest, zwischen UTF-8 und UTF-16 usw. sowie zwischen Little-Endian- und Big-Endian-Varianten von UTF-16 usw. unterscheiden. Es gibt keinen universellen Standard zum Anzeigen einer Datei wird in jeder anderen gängigen Codierung wie CP-1252 oder KOI-8 codiert.
Und so weiter. Keine der oben genannten Metadaten wird in die Textdatei geschrieben - daher muss der Endbenutzer das Programm informieren, wenn er die Datei liest. Der Endbenutzer muss die Metadatenwerte für eine bestimmte Datei kennen oder das Risiko eingehen, dass sein Programm die falschen Metadatenwerte verwendet.
Bush hat die Fakten versteckt
Versuchen Sie dies unter Windows XP.
- Öffnen Sie den Editor.
- Stellen Sie die Schriftart auf Arial Unicode MS ein. (Möglicherweise müssen Sie es zuerst installieren. Wenn es im Menü nicht angezeigt wird, klicken Sie auf "Weitere Schriftarten anzeigen".)
- Gib den Text "Bush hat die Fakten versteckt" ein.
- Wählen Sie
Save As
. Encoding
Wählen Sie im Menü ANSI
.
- Schließen Sie den Editor.
- Öffnen Sie das Dokument erneut (z. B. mit
Start
, My Recent Documents
).
- Sie werden 畂 畂 桳 栠 摩 琠 敨 映 捡 anstelle von "Bush versteckte die Fakten" sehen.
Dies zeigt, dass die IsTextUnicode
von Notepad verwendete Funktion fälschlicherweise vermutet, dass der ANSI-Text (wirklich Code Page 1252) Unicode UTF-16LE ohne Stückliste ist. In einer Datei ist keine Stückliste gespeichert als ANSI
.
Windows 7
Mit Windows 7 hat Microsoft angepasst IsTextUnicode
, dass das oben Genannte nicht passiert. Wenn keine Stückliste vorhanden ist, ist es jetzt wahrscheinlicher, dass ANSI (CP 1252) als Unicode (UTF-16LE) erraten wird. Mit dem Windows-7 Ich erwarte , dass Sie sind daher eher wahrscheinlich das umgekehrte Problem haben: Eine Datei mit Codepunkten Unicode - Zeichen , die mehr als 255, aber ohne BOM, ist jetzt eher als ANSI erraten werden - und damit falsch angezeigt.
Codierungsprobleme verhindern
Derzeit scheint der beste Ansatz darin zu bestehen, UTF-8 überall zu verwenden. Im Idealfall würden Sie alle alten Textdateien in UTF-8 umcodieren und nur Textdateien als UTF-8 speichern. Es gibt Tools wie recode und iconv , die dabei helfen können.