1141 Stimmen

Was ist der Unterschied zwischen UTF-8 und UTF-8 mit BOM?

Was ist der Unterschied zwischen UTF-8 und UTF-8 mit BOM?

89 Stimmen

UTF-8 kann besser durch Inhalte als durch BOM automatisch erkannt werden. Die Methode ist einfach: Versuchen Sie, die Datei (oder einen String) als UTF-8 zu lesen, und wenn dies gelingt, nehmen Sie an, dass die Daten UTF-8 sind. Andernfalls gehen Sie davon aus, dass es sich um CP1252 (oder eine andere 8-Bit-Codierung) handelt. Jede nicht-UTF-8-acht-Bit-Codierung wird fast sicher Sequenzen enthalten, die von UTF-8 nicht erlaubt sind. Reines ASCII (7-Bit) wird als UTF-8 interpretiert, aber das Ergebnis ist auch so korrekt.

53 Stimmen

Das Scannen großer Dateien nach UTF-8-Inhalten dauert einige Zeit. Ein BOM beschleunigt diesen Prozess erheblich. In der Praxis müssen Sie oft beides tun. Der Übeltäter heutzutage ist, dass immer noch viele Textinhalte nicht Unicode sind, und ich stoße immer noch auf Tools, die behaupten, sie würden Unicode (zum Beispiel UTF-8) verwenden, aber ihren Inhalt in einer anderen Codepage ausgeben.

11 Stimmen

@Tronic Ich denke nicht wirklich, dass "besser" in diesem Fall passt. Es kommt auf die Umgebung an. Wenn Sie sicher sind, dass alle UTF-8-Dateien mit einem BOM markiert sind, ist das Überprüfen des BOM der "bessere" Weg, da er schneller und zuverlässiger ist.

37voto

Helen Craigman Punkte 1391

UTF-8 mit BOM wird besser identifiziert. Ich bin zu diesem Schluss gekommen. Ich arbeite an einem Projekt, bei dem eines der Ergebnisse eine CSV-Datei ist, die Unicode-Zeichen enthält.

Wenn die CSV-Datei ohne BOM gespeichert wird, denkt Excel, dass es ANSI ist und zeigt Kauderwelsch an. Sobald Sie "EF BB BF" am Anfang hinzufügen (beispielsweise durch erneutes Speichern mit UTF-8 in Notepad; oder Notepad++ mit UTF-8 mit BOM), öffnet Excel es korrekt.

Das Voranstellen des BOM-Zeichens zu Unicode-Textdateien wird von RFC 3629 empfohlen: "UTF-8, ein Transformationsformat von ISO 10646", November 2003 unter https://www.rfc-editor.org/rfc/rfc3629 (Diese Information wurde zuletzt gefunden unter: http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html)

7 Stimmen

Danke für diesen ausgezeichneten Tipp, falls man UTF-8-Dateien für die Verwendung in Excel erstellt. In anderen Fällen würde ich jedoch weiterhin den anderen Antworten folgen und auf das BOM verzichten.

5 Stimmen

Es ist auch nützlich, wenn Sie Dateien erstellen, die nur ASCII enthalten und später möglicherweise Nicht-ASCII hinzugefügt werden. Ich bin gerade auf ein solches Problem gestoßen: Software, die utf8 erwartet, Dateien mit einigen Daten zur Benutzerbearbeitung erstellt. Wenn die Ausgangsdatei nur ASCII enthält, in einigen Editoren geöffnet und dann gespeichert wird, landet sie in latein-1 und alles bricht zusammen. Wenn ich das BOM hinzufüge, wird es vom Editor als UTF8 erkannt und alles funktioniert.

1 Stimmen

Ich habe mehrere programmbezogene Tools gefunden, die das BOM benötigen, um UTF-8-Dateien korrekt zu erkennen. Visual Studio, SSMS, Sourcetree...

19voto

jpc-ae Punkte 141

Diese Frage hat bereits eine Million und eins Antworten, und viele davon sind ziemlich gut, aber ich wollte versuchen zu klären, wann ein BOM verwendet werden sollte oder nicht.

Wie bereits erwähnt, ist die Verwendung des UTF BOM (Byte Order Mark) zur Bestimmung, ob eine Zeichenkette UTF-8 ist oder nicht, eine educated guesswork. Wenn Metadaten verfügbar sind (wie charset="utf-8"), dann wissen Sie bereits, was Sie verwenden sollen, aber ansonsten müssen Sie testen und Annahmen treffen. Dies beinhaltet das Überprüfen, ob die Datei, aus der eine Zeichenkette stammt, mit dem hexadezimalen Byte-Code EF BB BF beginnt.

Wenn ein Byte-Code, der dem UTF-8 BOM entspricht, gefunden wird, ist die Wahrscheinlichkeit hoch genug anzunehmen, dass es sich um UTF-8 handelt, und Sie können von dort aus fortfahren. Wenn Sie jedoch gezwungen sind, diese Annahme zu treffen, wäre es trotzdem eine gute Idee, zusätzliche Fehlerüberprüfungen beim Lesen durchzuführen, falls etwas unlesbar erscheint. Sie sollten nur annehmen, dass kein BOM UTF-8 ist (d.h. Latin-1 oder ANSI), wenn die Eingabe basierend auf ihrer Quelle definitiv nicht UTF-8 sein sollte. Wenn kein BOM vorhanden ist, können Sie jedoch einfach feststellen, ob es sich um UTF-8 handeln soll, indem Sie es gegen die Codierung validieren.

Warum wird ein BOM nicht empfohlen?

  1. Nicht-Unicode-fähige oder schlecht konforme Software könnte annehmen, dass es sich um Latin-1 oder ANSI handelt und das BOM nicht aus der Zeichenkette entfernen, was offensichtlich Probleme verursachen kann.
  2. Es wird nicht wirklich benötigt (überprüfen Sie einfach, ob die Inhalte konform sind und verwenden Sie immer UTF-8 als Backup, wenn keine konforme Codierung gefunden werden kann)

Wann sollten Sie mit einem BOM verschlüsseln?

Wenn Sie die Metadaten nicht auf andere Weise aufzeichnen können (durch ein charset-Tag oder Metadaten des Dateisystems) und die verwendeten Programme BOMs mögen, sollten Sie mit einem BOM verschlüsseln. Dies gilt insbesondere für Windows, wo alles ohne BOM im Allgemeinen angenommen wird, dass es eine legacy Codepage verwendet. Das BOM sagt Programmen wie Office, dass der Text in dieser Datei Unicode ist; hier ist die verwendete Codierung.

Letztendlich habe ich nur mit CSV-Dateien wirklich Probleme. Je nach Programm muss es entweder ein BOM haben oder eben nicht. Zum Beispiel muss es bei der Verwendung von Excel 2007+ auf Windows mit einem BOM verschlüsselt sein, wenn Sie es reibungslos öffnen möchten und nicht gezwungen sein möchten, die Daten zu importieren.

11 Stimmen

Der letzte Abschnitt Ihrer Antwort ist zu 100% korrekt: Der einzige Grund, einen BOM zu verwenden, ist, wenn Sie mit fehlerhafter Software interagieren müssen, die nicht standardmäßig UTF-8 verwendet, um unbekannte Dateien zu analysieren.

19voto

DavidRR Punkte 16458

Frage: Was ist der Unterschied zwischen UTF-8 und UTF-8 ohne BOM? Welches ist besser?

Hier sind einige Auszüge aus dem Wikipedia-Artikel über das Byte-Reihenfolgenzeichen (BOM), die meiner Meinung nach eine solide Antwort auf diese Frage bieten.

Zur Bedeutung des BOM und von UTF-8:

Der Unicode-Standard erlaubt das BOM in UTF-8, es wird jedoch nicht benötigt oder empfohlen. Die Byte-Reihenfolge hat keine Bedeutung in UTF-8, daher dient sie in UTF-8 nur dazu, am Anfang anzuzeigen, dass der Textstrom in UTF-8 codiert ist.

Argument gegen die Verwendung eines BOM:

Die Hauptmotivation für die Nichtverwendung eines BOM ist die Abwärtskompatibilität mit Software, die nicht Unicode-fähig ist... Eine weitere Motivation für die Nichtverwendung eines BOM ist die Förderung von UTF-8 als "Standard"-Codierung.

Argument für die Verwendung eines BOM:

Das Argument für die Verwendung eines BOM ist, dass ohne ihn eine heuristische Analyse erforderlich ist, um festzustellen, welche Zeichencodierung eine Datei verwendet. Historisch gesehen ist eine solche Analyse zur Unterscheidung verschiedener 8-Bit-Codierungen kompliziert, fehleranfällig und manchmal langsam. Es gibt eine Reihe von Bibliotheken, die die Aufgabe erleichtern, wie z.B. Mozilla Universal Charset Detector und International Components for Unicode.

Programmierer gehen fälschlicherweise davon aus, dass die Erkennung von UTF-8 genauso schwierig ist (was nicht der Fall ist, da aufgrund der überwältigenden Anzahl ungültiger UTF-8-Bytefolgen sind, während die Codierungen, die diese Bibliotheken zu unterscheiden versuchen, alle möglichen Byte-Folgen zulassen). Daher führen nicht alle Unicode-fähigen Programme eine solche Analyse durch und verlassen sich stattdessen auf den BOM.

Insbesondere Microsoft-Compiler und -Interpreter sowie viele Softwareanwendungen unter Microsoft Windows wie z.B. Notepad lesen UTF-8-Text nicht korrekt, es sei denn, er besteht nur aus ASCII-Zeichen oder beginnt mit dem BOM, und fügen beim Speichern von Text als UTF-8 ein BOM am Anfang hinzu. Google Docs fügt ein BOM hinzu, wenn ein Microsoft Word-Dokument als einfache Textdatei heruntergeladen wird.

Zur Frage, was besser ist, mit oder ohne dem BOM:

Die IETF empfiehlt, dass, wenn ein Protokoll entweder (a) immer UTF-8 verwendet oder (b) eine andere Möglichkeit hat, anzuzeigen, welche Codierung verwendet wird, es "die Verwendung von U+FEFF als Signatur VERBIETEN sollte".

Mein Fazit:

Verwenden Sie das BOM nur, wenn die Kompatibilität mit einer Softwareanwendung absolut unerlässlich ist.

Beachten Sie auch, dass obwohl der zitierte Wikipedia-Artikel darauf hinweist, dass viele Microsoft-Anwendungen auf das BOM angewiesen sind, um UTF-8 korrekt zu erkennen, dies nicht für alle Microsoft-Anwendungen gilt. Wenn Sie beispielsweise den Windows-Befehlszeileninterpreter mit UTF-8† verwenden, erwarten Befehle wie type und more kein vorhandenes BOM. Wenn ein BOM vorhanden ist, kann dies für andere Anwendungen problematisch sein.


† Der chcp-Befehl bietet Unterstützung für UTF-8 (ohne BOM) über die Codepage 65001.

5 Stimmen

Ich sollte mich besser an OHNE das BOM halten. Ich habe festgestellt, dass .htaccess und gzip-Komprimierung in Kombination mit UTF-8 BOM einen Kodierungsfehler verursachen. Ändern Sie die Kodierung in UTF-8 ohne BOM, um einem Vorschlag zu folgen, wie hier erklärt here da Problem zu lösen.

1 Stimmen

'Ein weiteres Motiv, keinen BOM zu verwenden, ist die Förderung von UTF-8 als "Standard"-Kodierung.' - Ein so starkes und gültiges Argument, dass du die Antwort eigentlich dort hättest beenden können!... ;-o Es sei denn, du hast einen besseren Vorschlag für die universelle Textdarstellung. ;) (Ich weiß nicht, wie alt du bist, wie viele Jahre du im prä-UTF8-Zeitalter gelitten hast (als Linguisten verzweifelt sogar in Erwägung zogen, ihre Alphabete zu ändern), aber ich kann dir sagen, dass jeder Moment, in dem wir dem Durcheinander all der alten einzelnen Ein-Byte-Kodierungen ohne Metadaten näherkommen, statt "die eine" zu haben, reine Freude ist.)

0 Stimmen

Siehe auch dieses Kommentar dazu, wie das Hinzufügen eines BOM (oder irgendetwas anderes!) zu einem der einfachsten Textdateiformate, "Plain Text", genau bedeutet, dass das beste universelle Textcodierungsformat nicht mehr "einfach" und "einfach" (d.h. "überflüssig") ist!...

18voto

Halil Özgür Punkte 15159

BOM neigt dazu, irgendwo, irgendwo zu "boom" (kein Wortspiel beabsichtigt (sic)). Und wenn es boomt (zum Beispiel nicht von Browsern, Editoren usw. erkannt wird), erscheint es als seltsame Zeichen am Anfang des Dokuments (zum Beispiel eine HTML-Datei, JSON-Antwort, RSS, etc.) und verursacht peinliche Situationen wie das kürzliche Encoding-Problem während des Gesprächs von Obama auf Twitter.

Es ist sehr ärgerlich, wenn es an schwer zu debuggenden Stellen oder bei Vernachlässigung von Tests angezeigt wird. Daher ist es am besten, es zu vermeiden, es sei denn, Sie müssen es verwenden.

0 Stimmen

Ja, ich habe gerade Stunden damit verbracht, ein Problem zu identifizieren, das durch eine Datei verursacht wurde, die als UTF-8 statt als UTF-8 ohne BOM codiert war. (Das Problem trat nur in IE7 auf, daher hat mich das auf eine ziemlich wilde Gänsejagd geführt. Ich habe Djangos "include" verwendet.)

0 Stimmen

Zukünftige Leser: Beachten Sie, dass das oben erwähnte Tweet-Problem nicht streng mit BOM zusammenhängt, aber wenn es so wäre, würde der Tweet auf ähnliche Weise verfälscht werden, jedoch am Anfang des Tweets.

15 Stimmen

@user984003 Nein, das Problem ist, dass Microsoft Sie in die Irre geführt hat. Was es als UTF-8 bezeichnet, ist nicht wirklich UTF-8. Was es als UTF-8 ohne BOM bezeichnet, ist das, was UTF-8 wirklich ist.

9voto

Wernfried Domscheit Punkte 45772

Es ist zu beachten, dass für einige Dateien du auf Windows keinesfalls das BOM haben solltest. Beispiele sind SQL*plus oder VBScript Dateien. Falls solche Dateien ein BOM enthalten, erhältst du einen Fehler, wenn du versuchst, sie auszuführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X