Was ist der Unterschied zwischen UTF-8 und UTF-8 ohne BOM?
Was ist der Unterschied zwischen UTF-8 und UTF-8 ohne BOM? Was ist besser?
- UTF-8 kann automatisch erkannt besser vom Inhalt als von BOM. Die Methode ist einfach: versuchen Sie, die Datei zu Lesen (oder eine Zeichenfolge) als UTF-8 und wenn das gelingt, davon ausgehen, dass die Daten UTF-8. Ansonsten davon ausgehen, dass es CP1252 (oder einen anderen 8-bit-encoding). Alle nicht-UTF-8-bit-Codierung wird mit ziemlicher Sicherheit enthalten Sequenzen, die nicht erlaubt sind durch UTF-8. Reines ASCII (7-bit) wird interpretiert als UTF-8, aber das Ergebnis ist korrekt, auch so.
- Das Scannen von großen Dateien UTF-8 content braucht Zeit. Eine Stückliste wird dieser Prozess viel schneller. In der Praxis ist es oft notwendig, beides zu tun. Der Täter ist heute, dass noch eine Menge von text-Inhalten ist nicht Unicode, und ich noch bump in tools, die sagen, Sie tun Unicode (z.B. UTF-8) aber Strahlen Ihre Inhalte mit einem anderen Zeichensatz.
- Ich glaube nicht wirklich, dass "besser" passt in diesem Fall. Es hängt von der Umgebung ab. Wenn Sie sicher, dass alle UTF-8-Dateien sind gekennzeichnet mit einem Stückliste über die Prüfung der Stückliste ist der "bessere" Weg, weil es schneller und zuverlässiger.
- UTF-8 nicht über einen BOM. Wenn man eine U+FEFF-code Punkt am Anfang einer UTF-8-Datei, muss mit besonderer Sorgfalt vorgenommen werden, damit umzugehen. Dies ist nur ein Microsoft-Namensgebung liegt, wie das aufrufen einer Codierung "Unicode", wenn es keine solche Sache.
- Es gibt keine Methode, die immer klappt. Metadaten können falsch sein - er kann sagen, Latin1, sondern tatsächlich in UTF-8 oder Umgekehrt. Daten können beschädigt werden oder falsch generiert, so nur, weil es ungültig ist UTF-8 bedeutet nicht, dass es nicht am besten interpretiert als "UTF-8 mit ein bisschen Korruption". Oft das ist, was es sein wird. BOM hilft die Unterscheidung zwischen "fehlerhaften/Ungültigen UTF-8" und "korrupten/ungültigen Latin1"
- Sie in der Regel nicht wollen, es sei denn, Sie haben einen spezifischen Bedarf. Es kann zurückgegeben werden, in Ihren HTML-Code aus einem PHP-fragment zum Beispiel. Die moderne Mainframe (und AIX) ist little-endian-UTF-8-gerüstet, sogar wenn dies ist nicht "native". So lange, wie Sie zu standardisieren, sollten Sie OK sein.
- "Die moderne Mainframe (und AIX) ist little-endian-UTF-8 aware" UTF-8 nicht über einen Ausgang! es ist kein mischen von bytes um zu setzen, Paare oder Gruppen von vier in der richtigen "Reihenfolge" für ein bestimmtes system! Zu erkennen, dass eine UTF-8-byte-Sequenz kann es nützlich sein zu beachten, dass das erste byte einer multi-byte-Sequenz "codepoint" (die bytes sind NICHT "einfache" ASCII-Bilder) hat das MS-bit gesetzt und alle ein bis drei weitere sukzessive weniger signifikanten bits, gefolgt von einem reset bit. Die Gesamtanzahl der bits ist weniger bytes, die in diesem Codepunkt, und Sie werden ALLE haben das MSB gesetzt...
- Es ist kein Unterschied, als utf-8 ohne BOM. Utf-8 + BOM ist in utf-8+ BOM, eine nicht-standard: verwendet mein microsoft -, und vielleicht noch einige andere.
- In diesem Fall hilft jemand anderes, mir ist aufgefallen, dass (für websites zumindest), im IIS auf Windows-Servern, speichern Sie Ihre Dateien immer als UTF-8 mit BOM (und regelmäßige notepad tut dies, wenn Sie wählen Sie es in der Codierung Dropdown-Menü in der "Speichern Als" - dialog). Aber auf Unix-Servern, habe ich immer meine Dateien als UTF-8 ohne BOM (da hatte ich Probleme der Zeichenkodierung, wenn mein apache-server Lesen würde mein PHP-Dateien, wenn Sie hatte die BOM). Notepad++ hat eine große "Encoding" - Menü, um zu helfen, zu konvertieren von einem zum anderen.
- Das Lesen dieser Diskussion über die (vermeintliche) Dienstprogramm zum hinzufügen eines BOM, ich Frage mich: Wie die meisten anderen codepages nicht haben oder (vermeintlich) brauchen eine codepage Identifizierung, warum UTF tut? Warum nur die codepage(s), die geändert werden müssen, ist (sind) UTF? Warum nicht eine BOM (oder gleichwertig erkennen Codierung) für die windows-1252-oder DOS-852 oder ISO 8859-1? Das ist eine ziemlich unfaire Forderung. Eine, die nur will Microsoft zu verhängen. 🙁
- order" ist für Sie, wenn Sie zwei oder mehr bytes, die ein einzelnes Zeichen, und Sie müssen wissen, wie herum Sie sind, so können Sie Sie Lesen richtig. Windows-1252, ISO-8859-1, etc. sind alle single-byte-Codierungen, es ist nur ein byte pro Zeichen, so gibt es keine Notwendigkeit für eine Byte-Order-Mark zu sagen, die Art und Weise, Sie zu Lesen. Sie sind nicht gedacht, um festzustellen, welche Kodierung verwendet; Sie verwendet werden, da sonst keine automatische Möglichkeit, zu sagen. Aber Sie sind nicht zuverlässig für Sie. Stücklisten auf multibyte-Codierungen werden nicht in eine Microsoft-Sache, nur UTF8+BOM ist.
- Tatsache 1: UTF-8 ist eine byte-orientierte Codierung übertragen im Netz bestellen, hat kein "byte-Reihenfolge", braucht kein "byte-Reihenfolge". Tatsache 2: windows-Verwendung von UCS-2, ganz ähnlich wie UTF-16, ist ein multi-byte-Codierung, für die Microsoft geben keine Stückliste. Holen Sie sich Ihren richtigen Fakten @TessellatingHeckler .
- meine Fakten Recht?" Welche Tatsachen habe ich etwas falsch? Deine Fakten nicht widersprechen, was ich sagte.
- Sie sind eine Einführung in die "byte order" - Konzept, nicht mich (meinen ersten Kommentar nicht Adresse). Aber UTF-8 benötigt keine byte-order-Erkennung oder die Beschreibung. Es ist gebildet durch eine Folge von bytes. So gibt es keine Notwendigkeit für eine Byte-Order-Mark in UTF-8. ... Zur Identifikation: UTF-8 die zuverlässigste Kodierung, um korrekt erkannt werden (bei der UNICODE-Codepoint über 128 verwendet werden) benötigt keine Stückliste. ... Wieder: Fakt-1: UTF-8 braucht keine "byte-Reihenfolge". Tatsache 2: Microsoft verwenden (angeblich) 2-byte-Kodierung ohne BOM, Warum ist BOM Bedarf in andere Codierungen? @TessellatingHeckler
- utf-8 ist ein byte-stream, so, es ist wirklich nicht eine byte-Reihenfolge, aber in diesem Fall, die 3-byte-BOM fungiert als eine Unterschrift sowieso. Die Software sollte wissen, ob die Codierung ANSI oder utf-8. Im Falle von utf-8 Inhalten behandelt wird als ANSI-Codierung, die resultierenden Zeichen werden falsch sein, weil die Byte-Sequenzen behandelt werden, als wären Sie einzelne Zeichen, whiich ist falsch. Auf der anderen Seite, wenn die software behandelt ANSI-codierte Dateien als utf-8 es werden Fehler aufgrund von Defekten oder unvollständigen Sequenzen.
- Sie argumentieren gegen Dinge, die ich nie sagte. Codierungen, die /Notwendigkeit/ einer Stückliste müssen Sie es /Sie sagen, die byte-Reihenfolge/. Codierungen, die nicht /brauchen/ BOM, brauchen Sie nicht zu sagen, Sie können die byte-Reihenfolge. UTF-8 hat eine optionale Stückliste in der spec, die missbraucht werden kann, um zu erkennen, Verwendung von UTF-8. Das ist nicht "das ändern der standard", das ist, warum es unterscheidet sich vom klassischen Zeichensätzen. Es geht nicht um die Erkennung der byte-Reihenfolge UTF-8, und ich habe nie gesagt, dass. SIE führte byte-Reihenfolge, wenn Sie sagte: "der (vermeintliche) Dienstprogramm zum hinzufügen eines BOM". Wo muss Microsoft die Verwendung von 2-byte/ohne BOM? DOTNet verwendet 2-byte - +Stückliste für ein Beispiel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den UTF-8-BOM ist eine Sequenz von Bytes am Anfang von einem text-stream (EF BB BF) erlaubt, dass die Leser mehr zuverlässig erraten, eine Datei als UTF-8 kodiert.
Normalerweise die Stückliste verwendet wird, um ein signal endianness eine Kodierung, aber da endianness unerheblich ist UTF-8, BOM ist unnötig.
Entsprechend der Unicode-standard, die BOM für UTF-8-Dateien ist nicht empfohlen,:
ABC
), aber das ist nicht zu wahrscheinlich kommen über außerhalb von Arglist oder schlecht entwickelte software. Ich persönlich denke, es macht die Erkennung von UTF-8 mehr effizient, aber ich bin ehrlich gesagt nicht sehr gut auf die Arbeit mit Unicode noch.Anderen sehr guten Antworten bereits beantwortet:
EF BB BF
Aber als zusätzliche information die BOM für UTF-8 könnte ein guter Weg, um zu "riechen", wenn ein string in UTF-8 kodiert... Oder es könnte eine legitime string in irgendeiner anderen Kodierung...
Beispielsweise die Daten, die [EF BB BF 41 42 43] könnte entweder sein:
So, während Sie kann kühl sein, zu erkennen, die Kodierung einer Datei-Inhalte durch einen Blick auf das erste Byte sind, sollten Sie nicht verlassen sich auf diese, wie zeigen Sie am Beispiel oben
Codierungen bekannt sein sollten, nicht Ahnen.
F0 A0 AC A0
. Die byte-Reihenfolge der bytes ist genau definiert durch die UTF-8-standard, so gibt es keine Notwendigkeit für eine byte-order mark in UTF-8. (Seine Verwendung als eine identifier-Codierung ist eine andere Frage; bin ich speziell sagen, dass es nicht notwendig ist, zu identifizieren byte-Reihenfolge.)Those bytes, if present, must be ignored
Ist nicht die Stückliste auch zero width non-breaking space (ZWNBS)? Wenn dem so ist, sollte es nicht so gedeutet werden, dass unicode-Zeichen, und geschrieben, wie, dass der Charakter in welcher Codierung korrekt ist?Ignored
scheint, wie die falsche Begriff hier zu verwenden.Gibt es mindestens drei Probleme mit dem setzen, ein BOM in UTF-8 codierte Dateien.
Und, wie andere erwähnt haben, ist es weder ausreichend noch notwendig, um eine Stückliste, um zu erkennen, dass etwas ist UTF-8:
cat
nicht geben Sie eine clean Ergebnis, ein Ergebnis, das hat BOM nur am start. Wenn Sie bedeutete, dass, dann, weilcat
arbeitet auf byte-Ebene, nicht auf den Inhalt interpretiert Ebene, und in ähnlicher Weisecat
nicht umgehen können mit Fotos, sagen. Noch ist es nicht viel Schaden. Das ist, weil die BOM kodiert für ein zero-width non-breaking space.U+FEFF -> ZERO WIDTH NO-BREAK SPACE
. Eine Datei, die enthält nur eine Stückliste ist nicht leer, es enthält eine normale (aber unsichtbare) Zeichen. In einer text-Datei können Sie so vieleZERO WIDTH NO-BREAK SPACE
Zeichen, wie Sie möchten - wie jeder andere Charakter. In einigen Skriptsprachen solche Technik wird verwendet, um zu verschleiern Ihre source-code.ZERO WIDTH NO-BREAK SPACE
. Eine Datei, die enthält nur eine Stückliste ist nicht leer, es enthält eine normale (aber unsichtbare) Zeichen. In einer text-Datei können Sie so viele ZERO WIDTH NO-BREAK SPACE-Zeichen, wie Sie möchten. Aber die Byte Order Mark (BOM) - FAQ sagt:It ' a eine alte Frage mit vielen guten Antworten, aber eine Sache, die Hinzugefügt werden soll.
Alle Antworten sind sehr allgemein. Was ich möchte hinzufügen, sind Beispiele für die Stücklistenverwendung, die tatsächlich echte Probleme verursachen, und doch viele Menschen wissen nichts über es.
BOM bricht Skripte
Shell-scripts, Perl scripts, Python scripts, Ruby-Skripte, Node.js Skripte oder andere ausführbare Datei, die ausgeführt werden muss, von einem Dolmetscher - beginnen alle mit einer shebang-Zeile, die aussieht wie eine von diesen:
Es teilt dem system mit, welcher interpreter ausgeführt werden muss, wenn die Berufung auf ein solches Skript. Wenn das Skript in UTF-8 codiert, man kann geneigt sein, um eine BOM am Anfang. Aber tatsächlich ist das "#! " - Zeichen sind nicht nur Zeichen. Sie sind in der Tat eine Magische Zahl das passiert aus zwei ASCII-Zeichen. Wenn Sie etwas (wie eine BOM), bevor diese Zeichen, dann wird die Datei so Aussehen, wie es hatte eine andere Magische Zahl und das kann zu Problemen führen.
Siehe Wikipedia, Artikel: Shebang, Abschnitt: Magische Zahl:
BOM ist illegal in JSON
Sehen RFC 7159, Abschnitt 8.1:
BOM ist redundant in JSON
Nicht nur, es ist illegale im JSON -, es ist auch nicht benötigt, um zu bestimmen, die Zeichenkodierung, da gibt es zuverlässigere Möglichkeiten, um eindeutig bestimmen sowohl die Zeichen-Codierung und-endian verwendet JSON-stream (siehe diese Antwort für details).
BOM bricht JSON-Parser
Nicht nur, es ist illegale in JSON und nicht benötigt es eigentlich bricht alle software, dass bestimmen Sie die Codierung mit der Methode präsentiert in RFC 4627:
Bestimmung der Kodierung und endianness JSON, die Prüfung der ersten 4 bytes für die NUL-byte:
Nun, wenn die Datei beginnt mit der BOM wird es so Aussehen:
Beachten Sie, dass:
Abhängig von der Implementierung, die alle diese möglicherweise falsch interpretiert als UTF-8 und dann falsch interpretiert oder abgelehnt, wie ungültige UTF-8, oder gar nicht erkannt.
Zusätzlich, wenn bei der Durchführung von tests für die gültige JSON als ich es empfehlen, wird es ablehnen, sogar der Eingang, der ist in der Tat als UTF-8 kodiert, weil es beginnt nicht mit einem ASCII-Zeichen < 128, wie es sollte nach dem RFC.
Andere Daten-Formate
Stückliste in JSON nicht benötigt, ist illegal und Pausen-software, die funktioniert korrekt gemäß RFC. Es sollte ein nobrainer einfach nicht zu verwenden, es dann und doch, es gibt immer Leute, die darauf bestehen, brechen JSON-durch die Verwendung von Stücklisten, Kommentare, verschiedene quoting-Regeln oder andere Datentypen. Natürlich ist jedermann frei, die Dinge, wie Stücklisten oder irgendetwas anderes, wenn Sie es brauchen - nur nennen Sie es nicht JSON dann.
Anderen Daten-Formaten als JSON, werfen Sie einen Blick, wie es wirklich aussieht. Wenn die nur-Kodierungen sind UTF-* und das erste Zeichen muss ein ASCII-Zeichen niedriger als 128 ist, dann haben Sie bereits alle Informationen, die benötigt werden, um zu bestimmen, sowohl die Kodierung und den endian der Daten. Hinzufügen von Stücklisten, die auch als optionales feature wäre, nur damit es mehr kompliziert und fehleranfällig.
Andere Verwendungen von BOM
Als für den Gebrauch außerhalb von JSON oder scripts, ich denke, es gibt schon sehr gute Antworten hier. Ich wollte noch hinzufügen detailliertere Informationen speziell über scripting und Serialisierung, denn es ist ein Beispiel von BOM-Zeichen verursacht echte Probleme.
Kurze Antwort: In UTF-8, BOM kodiert ist, wie die bytes
EF BB BF
am Anfang der Datei.Lange Antwort:
Ursprünglich wurde erwartet, dass Unicode wäre, kodiert in UTF-16/UCS-2. Die Stückliste wurde für diese Codierung bilden. Wenn du 2-byte-code-Einheiten, es ist notwendig, um anzugeben, in welcher Reihenfolge diese beiden bytes sind, und eine Allgemeine Konvention dabei ist, auch die Zeichen U+FEFF als ein "Byte Order Mark" an den Anfang der Daten. Das Zeichen U+FFFE ist permanent zugewiesen, so dass seine Präsenz kann verwendet werden, um zu erkennen, das falsche byte order.
UTF-8 hat die gleiche byte-Reihenfolge, unabhängig von der Plattform endian, also eine byte order mark ist nicht erforderlich. Allerdings kann es vorkommen (wie die byte-Sequenz
EF BB FF
) in Daten, die in UTF-8 konvertiert von UTF-16, oder als eine "Signatur", um anzugeben, dass die Daten UTF-8.Ohne. Als Martin Cote beantwortet, wird der Unicode-standard nicht zu empfehlen. Es bewirkt, dass Probleme mit nicht-BOM-aware software.
Einen besseren Weg, um zu erkennen, ob eine Datei UTF-8 ist die Durchführung einer Gültigkeit überprüfen. UTF-8 hat strenge Regeln darüber, was byte-Sequenzen sind gültig, so dass die Wahrscheinlichkeit eines false-positive ist vernachlässigbar. Wenn eine byte-Sequenz, die aussieht wie UTF-8, ist es wahrscheinlich.
UTF-8 mit BOM ist besser identifiziert werden. Erreicht habe ich diese Schlussfolgerung auf die harte Weise. Ich arbeite an einem Projekt, bei dem eines der Ergebnisse ist ein CSV - Datei, einschließlich Unicode-Zeichen.
Wenn die CSV-Datei ohne BOM, Excel denkt, es ist ANSI-und zeigt wirres Zeug. Sobald Sie "EF BB BF" auf der Vorderseite (zum Beispiel durch re-speichern mit Notepad UTF-8; oder Notepad++ mit UTF-8 mit BOM), Excel öffnet es in Ordnung.
Voranstellen, das BOM-Zeichen zu Unicode-text-Dateien wird empfohlen, RFC 3629: "UTF-8, a transformation format of ISO 10646", November 2003
bei http://tools.ietf.org/html/rfc3629 (diese Letzte info finden Sie unter: http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html)
UTF-8 having a single-octet encoding unit, this last function is useless and the BOM will always appear as the octet sequence EF BB BF.
BOM tendenziell boom (kein Wortspiel beabsichtigt (sic)) irgendwo, irgendwo. Und wenn es dröhnt (zum Beispiel, nicht erkannt von den Browsern, Editoren, etc.), es zeigt, wie die komischen Zeichen

am Anfang des Dokuments (zum Beispiel HTML-Datei, JSON Antwort, RSS, etc.) und bewirkt, dass die Art von Peinlichkeiten wie die aktuelle encoding-Problem erlebt während der Rede von Obama auf Twitter.Es ist sehr ärgerlich, wenn es zeigt sich an Orten, die schwer zu Debuggen, oder beim testen vernachlässigt. So ist es am besten zu vermeiden, es sei denn, Sie es verwenden müssen.
Hier sind einige Auszüge aus dem Wikipedia-Artikel über die byte order mark (BOM), dass ich glaube, eine solide Antwort auf diese Frage.
Auf die Bedeutung der BOM und UTF-8:
Argument für NICHT über Stückliste:
Argument FÜR über Stückliste:
Auf, was besser ist, MIT oder OHNE der Stückliste:
Mein Fazit:
Verwenden Sie die Stückliste nur, wenn die Kompatibilität mit einer software-Anwendung ist absolut notwendig.
Beachten Sie auch, dass während der referenzierten Wikipedia-Artikel zeigt, dass viele Microsoft-Anwendungen verlassen sich auf die Stückliste richtig zu erkennen, UTF-8, dies ist nicht der Fall für alle Microsoft-Anwendungen. Zum Beispiel, wie bereits von @barlop, wenn Sie die Windows-Eingabeaufforderung mit UTF-8†, Befehle wie
type
undmore
nicht erwarten, dass der Stückliste vorhanden sein. Wenn die Stückliste ist vorhanden ist, kann es problematisch sein, wie es für andere Anwendungen.† Der
chcp
Befehl bietet Unterstützung für UTF-8 (ohne der Stückliste) über code-Seite Fünf und sechzig tausend eins..htaccess
undgzip compression
in Kombination mit UTF-8-BOM gibt ein encoding-Fehler Ändern, um die Codierung in UTF-8 ohne BOM zu Folgen, um einen Vorschlag, wie bereits erläutert, hier die Probleme zu lösenZitiert unten auf der Wikipedia-Seite über Stückliste: http://en.wikipedia.org/wiki/Byte-order_mark#cite_note-2
Es sollte angemerkt werden, dass für einige Dateien, die Sie muss nicht die Stückliste auch auf Windows. Beispiele sind
SQL*plus
oderVBScript
- Dateien. Im Falle solcher Dateien enthält eine Stückliste erhalten Sie eine Fehlermeldung, wenn Sie versuchen, um Sie auszuführen.UTF-8 mit BOM hilft nur, wenn die Datei enthält tatsächlich einige nicht-ASCII-Zeichen. Wenn er enthalten ist, und die gibt es nicht, dann wird es möglicherweise brechen älteren Anwendungen, die sonst interpretiert die Datei als ASCII. Diese Anwendungen werden definitiv scheitern, wenn Sie auf eine nicht-ASCII-Zeichen, also meiner Meinung nach der Stückliste sollten nur Hinzugefügt werden, wenn die Datei können und sollten nicht mehr interpretiert werden als ASCII.
Edit: möchte Nur deutlich machen, dass ich lieber nicht über die Stückliste an alle, fügen Sie es in, wenn einige alte Müll bricht aus, und einbauen, dass die legacy-Anwendung ist nicht möglich.
Machen Sie nicht etwas erwarten, dass ein BOM für UTF-8.
UTF-8 ohne BOM hat keine Stückliste, die es nicht besser als UTF-8 mit BOM, außer wenn der Verbraucher von der Datei wissen muss (oder würden von dem wissen profitieren), ob die Datei in UTF-8-kodiert ist oder nicht.
Die Stückliste in der Regel nützlich, um zu bestimmen, die endianness der Codierung ist nicht erforderlich für die meisten Anwendungsfälle.
Auch der Stückliste können Sie unnötigen Lärm/der Schmerz für jene Verbraucher, die nicht wissen oder kümmern, und können in der Folge zu Verwirrung der Benutzer.
Ich betrachte dies aus einer anderen Perspektive. Ich denke, UTF-8 mit BOM ist besser, wie es liefert mehr Informationen über die Datei. Ich benutze UTF-8 ohne BOM nur, wenn ich mit Problemen konfrontiert.
Ich bin mit mehreren Sprachen (auch Kyrillisch) auf meinen Seiten für eine lange Zeit und wenn die Dateien gespeichert werden, ohne BOM und ich re-öffnen Sie zum Bearbeiten mit einem editor (als cherouvim auch darauf hingewiesen), einige Figuren sind beschädigt.
Beachten Sie, dass Windows' classic Editor speichert automatisch Dateien mit BOM beim speichern einer neu erstellten Datei mit UTF-8-Codierung.
Ich persönlich speichern server-Seite scripting-Dateien (.asp .ini .aspx) mit der Stückliste und .html-Dateien ohne BOM.
chcp 65001
für utf8-Unterstützung, ist es utf8 ohne bom. Wenn Sietype myfile
es wird nur korrekt angezeigt, wenn es keine Stückliste. Wenn Sieecho aaa>a.a
oderecho אאא>a.a
zur Ausgabe der Zeichen für die Datei ein.ein, und Sie haben chcp 65001, wird es ausgegeben wird ohne BOM.Wenn Sie Informationen anzeigen möchten, codiert in UTF-8 können Sie nicht mit Problemen konfrontiert. Deklarieren Sie beispielsweise ein HTML-Dokument als UTF-8 und Sie haben alles, was in Ihrem browser angezeigt, die in den Körper des Dokuments.
Aber dies ist nicht der Fall, wenn wir text -, CSV - und XML-Dateien, die entweder auf Windows oder Linux.
Beispielsweise eine text-Datei in Windows oder Linux, eine der einfachsten Dinge, die man sich vorstellen kann, es (normalerweise) nicht UTF-8.
Speichern Sie es als XML und deklarieren es als UTF-8:
Wird nicht angezeigt (es wird nicht gelesen werden) richtig, auch wenn es deklariert als UTF-8.
Ich hatte eine Zeichenfolge von Daten, die mit französischen Buchstaben, werden als XML gespeichert, die für syndication. Ohne erstellen einer UTF-8 Datei von Anfang an (das ändern der Optionen in der IDE und "Neue Datei Anlegen") oder hinzufügen eines BOM am Anfang der Datei
War ich nicht in der Lage, speichern Sie die französischen Buchstaben in einer XML-Datei.
Einen praktischen Unterschied ist, dass, wenn Sie schreiben Sie ein shell-Skript für Mac OS X und speichern Sie es als Klartext, UTF-8, Sie erhalten die Antwort:
in Reaktion auf die shebang-Zeile angeben, welche shell Sie verwenden möchten:
Wenn Sie speichern als UTF-8 ohne BOM (sagen wir in BBEdit) alles wird gut werden.
Diese Frage hat bereits eine million-und-Antworten-und viele von Ihnen sind ganz gut, aber ich wollte versuchen und zu klären, wenn eine Stückliste sollte oder sollte nicht verwendet werden.
Wie bereits erwähnt, wird jede Verwendung der UTF-BOM (Byte-Order Mark) in die Bestimmung, ob ein string ist UTF-8 oder nicht, ist gebildete Vermutung. Wenn es richtige Metadaten verfügbar (wie
charset="utf-8"
), dann wissen Sie bereits, was Sie sein soll mit, aber ansonsten wirst du testen müssen, und machen einige Annahmen. Dies umfasst die Prüfung, ob die Datei ein string kommt aus beginnt mit dem hexadezimalen byte-code, EF BB BF.Wenn ein byte-code der entsprechenden UTF-8-BOM gefunden wird, ist die Wahrscheinlichkeit hoch genug ist, um davon ausgehen, es ist UTF-8 und Sie können gehen von dort aus. Wenn gezwungen, um diese Vermutung jedoch zusätzliche Fehler zu überprüfen, während Sie Lesen, wäre noch eine gute Idee sein, falls etwas kommt Durcheinander. Sollten Sie nur annehmen, eine Stückliste ist nicht UTF-8 (d.h. der latin-1 oder ANSI), wenn der Eingang sollten nicht definitiv UTF-8 basierend auf der Quelle. Wenn es keine Stückliste, jedoch, Sie können einfach bestimmen, ob es sein soll UTF-8 durch die Validierung gegen die Kodierung.
Warum ist BOM nicht empfohlen?
Wenn sollte Sie Kodieren, mit einer Stückliste?
Wenn Sie nicht in der Lage bist zu erfassen die Metadaten in anderer Weise (durch ein charset-tag oder Datei-system-meta), und die Programme werden verwendet, wie Stücklisten, sollten Sie codieren mit einer Stückliste. Dies gilt besonders unter Windows, wo alles ohne eine Stückliste ist in der Regel davon ausgegangen, dass die Verwendung eines legacy-code-Seite. Die Stückliste erzählt Programme wie Office, dass, ja, der text in dieser Datei ist Unicode; hier ist die verwendete Codierung.
Wenn es darauf ankommt, die nur Dateien, die ich jemals wirklich Probleme mit CSV. Je nach Programm, die es entweder müssen oder nicht haben, müssen Sie eine Stückliste. Zum Beispiel, wenn Sie Excel 2007 verwenden+ auf Windows, muss es codiert werden mit einer Stückliste, wenn Sie wollen, öffnen Sie es sanft und nicht zu greifen, um die Daten zu importieren.
Wie oben erwähnt, UTF-8 mit BOM kann zu Problemen führen, die mit nicht-BOM-aware (oder kompatible) software. Ich habe einmal bearbeitet HTML-Dateien codiert als UTF-8 + BOM mit dem Mozilla-basierten KompoZer, als client erforderlich, dass WYSIWYG Programm.
Unweigerlich würde das layout zerstört beim speichern. Es nahm mir einige Zeit, um meine Geige Weg, um dieses. Diese Dateien dann gut funktioniert in Firefox, aber zeigte eine CSS-Macke in Internet Explorer zerstören das layout, wieder. Nach dem hantieren mit dem verlinkten CSS-Dateien für Stunden ohne Erfolg, ich entdeckte, dass Internet Explorer nicht wie die BOMfed HTML-Datei. Nie wieder.
Auch, ich fand gerade diese in der Wikipedia:
Den Unicode - Byte Order Mark (BOM) - FAQ bietet eine prägnante Antwort:
Vom http://en.wikipedia.org/wiki/Byte-order_mark:
Verwenden Sie immer ein BOM in der Datei sicherzustellen, dass es öffnet sich immer korrekt in den editor, der unterstützt UTF-8 und BOM.
Mein eigentliches problem mit der Abwesenheit der Stückliste ist die folgende. Nehmen wir an, wir haben eine Datei, die enthält:
Ohne BOM dies wird als ANSI in den meisten Editoren. Damit ein anderer Benutzer diese Datei öffnet diese und fügt einige native Zeichen, zum Beispiel:
Oops... Jetzt ist die Datei noch in den ANSI-und ratet mal, was "αβγ" nicht belegen 6 bytes, sondern 3. Dies ist nicht UTF-8, und dies bewirkt, dass andere Probleme, die später in die Entwicklung der Kette.
UTF mit BOM ist besser, wenn Sie die Verwendung von UTF-8 in HTML-Dateien, wenn Sie Serbisch-Kyrillisch, Serbisch (Lateinisch, Deutsch, Ungarisch oder etwas exotische Sprache auf der gleichen Seite. Das ist meiner Meinung nach (30 Jahren der Computer-und IT-Branche).