Windows 7 UTF-8 und Unicode


14

Könnte jemand erklären, was sich in Windows 7 (Pro 64-Bit) geändert hat?

Details: Zuvor hatte ich Windows XP und einige Übersetzungsdateien (UTF-8-codiert) im CSV-Format. Ich konnte die Schriftarten sowohl in Notepad als auch in Excel anzeigen. Nach dem Upgrade auf Windows 7, wenn ich diese Dateien öffne, sehe ich nur quadratische Kästchen (nur Sie wissen, wenn ich sie im Browser öffne, konnte ich alle Übersetzungen sehen). Wenn ich diese Dateien in Unicode speichere, scheint alles in Ordnung zu sein.

Also, was genau ist los? Warum arbeitet Windows 7 mit Unicode und nicht mit UTF-8?

Antworten:


30

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-endianund 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. EncodingWä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 IsTextUnicodevon 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.


3
Laut Wikipedia : In Windows Vista und Windows 7 [..] wurde IsTextUnicode geändert, um die Wahrscheinlichkeit zu erhöhen, dass eine bytebasierte Codierung anstelle von UTF-16LE erraten wird.
Arjan

Ja, sicher haben wir diese Dateien Stücklisten, da wir diese Dateien mit Stücklisten generieren. Es ist interessant, dass Windows 7 die vom älteren Betriebssystem erstellte Stückliste nicht liest.
Sha Le

Stückliste hat sich nicht geändert. Möglicherweise fehlt in Ihren Dateien die Stückliste, das Standardformat war jedoch eine Unicode-Variante, bei der es sich jetzt um ASCII handelt. Siehe meine Antwort.
Harrymc

@Sha Le: Wenn die Datei eine Stückliste enthält, sollte Windows 7 Notepad diese korrekt öffnen, sodass das beschriebene Problem nicht zu den bekannten Problemen passt isTextUnicode. Können Sie eine kleine Beispieldatei erstellen, die das Problem veranschaulicht, das Sie mit einer Datei haben, die eine Stückliste enthält?
RedGrittyBrick

Es gibt auch this app can breakfür den gleichen Effekt wieBush hid the facts
Regent

3

Eine Anmerkung: Sie können Notepad ++ verwenden , um diese Dateien über das Menü Encoding anzuzeigen.

Sobald die Dateien korrekt angezeigt werden, wird beim Speichern die richtige Stückliste hinzugefügt.


Ich weiß, dass dieser Beitrag ein bisschen alt ist, aber ich habe derzeit ein Problem mit Win 7 und Notepad ++, das UTF 8 ohne Stückliste nicht anzeigt, als die Dateien ursprünglich mit Notepad ++ v5.9.6.2 selbst erstellt wurden.
Jake

@Jake: Stellen Sie sicher, dass im Menü "Codierung" "In UTF8 codieren" und nicht "In UTF8 ohne Stückliste codieren" angezeigt wird.
Harrymc

1

In Windows 10 ist möglich (Test auf 1903 Build)

  1. Kopieren Sie Ihre Datei mit guter Kodierung TXTUTF-8.txtnach C:\WINDOWS\SHELLNEW.
  2. In HKEY_CLASSES_ROOT\.txt\ShellNeweine neue Kette mit Namen machen „ FileName
  3. Ändern Sie den Wert von " FileName" in " TXTUTF-8.txt".

Wenn Sie jetzt eine neue txt-Datei über das Windows-Menü erstellen, wird diese TXTUTF-8.txtals Vorlage verwendet

Quelle: https://answers.microsoft.com/fr-fr/windows/forum/all/configurer-lencodage-par-d%C3%A9faut-en-utf-8-dans/9c0358ca-a2b3-43e8-a154- d10c1fe94317

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.