Unicode-Signatur-BOM-Problem (Byte Order Mark) für UTF-8-Dateien

Unicode-Signatur-BOM-Problem (Byte Order Mark) für UTF-8-Dateien


Beim Debuggen einer chinesischen Zen Cart-Website mit UTF8-Kodierung ist mir kürzlich etwas Merkwürdiges aufgefallen. Der Text auf der Webseite wurde normal angezeigt, aber als ich die Quelldatei mit IE anzeigte (ich öffnete sie mit Notepad), fand ich verstümmelte Zeichen. Bei Firefox trat dieses Problem nicht auf. Nach vielen Online-Überprüfungen und Tests war das Problem gelöst. Es handelte sich tatsächlich um ein Problem mit der Unicode-Signatur BOM (Byte Order Mark) der UTF-8-Datei.

BOM (Byte Order Mark) ist eine Standardmarkierung, die zur Identifizierung der Kodierung im UTF-Kodierungsschema verwendet wird. In UTF-16 war es ursprünglich FF FE und in UTF-8 wird es zu EF BB BF. Dieses Flag ist optional und da UTF8-Bytes keine Reihenfolge haben, kann es verwendet werden, um zu erkennen, ob ein Bytestrom UTF-8-codiert ist. Microsoft führt diese Erkennung durch, manche Software tut dies jedoch nicht und behandelt es als normales Zeichen.

Microsoft fügt vor seinen eigenen UTF-8-Textdateien drei Bytes EF BB BF hinzu. Programme wie Notepad unter Windows verwenden diese drei Bytes, um zu bestimmen, ob eine Textdatei ASCII oder UTF-8 ist. Dies ist jedoch nur eine von Microsoft im Geheimen vorgenommene Markierung. Andere Plattformen haben keine solche Markierung für UTF-8-Textdateien.

Das bedeutet, dass eine UTF-8-Datei eine BOM haben kann oder auch nicht. Wie kann man sie also unterscheiden? Drei Methoden. 1. Öffnen Sie die Datei mit UltraEdit-32, wechseln Sie in den hexadezimalen Bearbeitungsmodus und prüfen Sie, ob der Dateikopf EF BB BF enthält. 2. Öffnen Sie es mit Dreamweaver, überprüfen Sie die Seiteneigenschaften und sehen Sie nach, ob vor „Unicode-Signatur-BOM einschließen“ ein Häkchen gesetzt ist. 3. Öffnen Sie die Datei mit dem Windows-Editor, wählen Sie „Speichern unter“ und prüfen Sie, ob die Standardkodierung der Datei UTF-8 oder ANSI ist. Wenn es ANSI ist, wird die Datei kein BOM haben.

Ich habe html_header.php in der Zen Cart-Vorlagendatei gefunden und festgestellt, dass die Datei kein BOM hatte. Ich habe sie mit UltraEdit-32 gespeichert, das BOM hinzugefügt und dann html_header.php hochgeladen. Alles war normal.

Beachten Sie, dass beim Konvertieren einer gb2312-Datei in eine UTF-8-Datei mit Convertz die Standardeinstellung darin besteht, BOM nicht einzuschließen. Die oben genannten verstümmelten Zeichen können ohne BOM erscheinen. Wenn BOM jedoch enthalten ist, sollten Sie mit PHP-Include-Dateien vorsichtig sein, da EF BB BF vor dem PHP-Bytestream hinzugefügt wird. Die vorherige Ausgabe auf dem Display kann zu Programmfehlern führen. Eine Lösung besteht darin, alle enthaltenen Dateien als ANSI zu speichern, und die Hauptdatei kann UTF-8 sein. Um die BOM aus einer Datei zu entfernen, öffnen Sie sie mit UlterEdit, wechseln Sie in den hexadezimalen Bearbeitungsmodus, ersetzen Sie die ersten drei Bytes (das verdammte EF BB BF) durch 20, speichern Sie die Datei (denken Sie daran, beim Speichern die automatische Sicherungsfunktion auszuschalten), wechseln Sie dann in den Standardbearbeitungsmodus und entfernen Sie die ersten drei Leerzeichen.

Ich habe auch einiges über die Kodierung gelernt: Die sogenannten in Unicode gespeicherten Dateien sind eigentlich UTF-16, was zufällig dasselbe ist wie der Unicode-Code, aber konzeptionell sind Unicode und UTF zwei verschiedene Dinge. Unicode ist ein Darstellungsschema für die Speicherkodierung und UTF ist ein Schema zum Speichern und Übertragen von Unicode. UTF-16 ist in zwei Typen unterteilt: High Byte First (LE) und High Byte Last (BE). Zur offiziellen UTF-Kodierung gehört auch UTF-32, welches ebenfalls in LE und BE unterteilt wird. Zur nicht-Unicode-offiziellen UTF-Kodierung gehört auch UTF-7, das vor allem für die E-Mail-Übertragung genutzt wird. Der Einzelbyte-Teil von UTF-8 ist mit ISO-8859-1 kompatibel. Dies liegt hauptsächlich daran, dass einige alte Systeme und Bibliotheksfunktionen UTF-16 nicht richtig verarbeiten können und daher nicht mehr verwendet werden. Bei englischen Zeichen wird dadurch auch Dateispeicherplatz gespart (auf Kosten der Platzverschwendung bei nicht-englischen Zeichen). Bei Verwendung von iso-8859-1 werden sowohl utf8 als auch iso-8859-1 durch ein Byte dargestellt. Bei der Darstellung anderer Zeichen verwendet utf-8 zwei oder drei Bytes.

<<:  Three.js realisiert den dynamischen 3D-Logoeffekt von Facebook Metaverse

>>:  Sammlung gemeinsamer DIV-Attribute

Artikel empfehlen

Docker nginx Beispielmethode zum Bereitstellen mehrerer Projekte

Voraussetzungen 1. Docker wurde auf dem lokalen C...

Detaillierte Bereitstellung von Docker+Gitlab+Gitlab-Runner

Umfeld Server: centos7 Kunde: Fenster Stellen Sie...

Detaillierte Beispiele zur Verwendung der JavaScript-Ereignisdelegierung (Proxy)

Inhaltsverzeichnis Einführung Beispiel: Ereignisd...

Tutorial zu HTML-Formular-Tags (1):

Formulare sind eine wichtige externe Form zur Imp...

Vue+el-table realisiert das Zusammenführen von Zellen

In diesem Artikelbeispiel wird der spezifische Co...

Klasse in Front-End-JavaScript

Inhaltsverzeichnis 1. Klasse 1.1 Konstruktor() 1....

WeChat-Applet + ECharts zur Realisierung eines dynamischen Aktualisierungsprozesses

Vorwort Kürzlich stieß ich auf eine Anforderung, ...

Implementierung der gemeinsamen Nutzung von Daten zwischen Docker Volume-Containern

Was ist Volumen? „Volume“ bedeutet auf Englisch K...

So implementieren Sie Zeilenumbrüche im Texteingabebereich von Textarea

Wenn Sie den Text im Textarea-Eingabebereich umbre...

Detailliertes Tutorial zur Installation von Hbase 2.3.5 auf Vmware + Ubuntu18.04

Vorwort Im vorherigen Artikel wurde Hadoop instal...

Einführung in bedingte Zugriffsattribute und Pfeilfunktionen in JavaScript

Inhaltsverzeichnis 1. Bedingte Zugriffsattribute ...

Detaillierte Erklärung der Text-Fill-Color-Eigenschaft in CSS3

Was bedeutet Textfüllfarbe? Rein wörtlich bedeute...