Was ist der Unterschied zwischen UTF-8 und UTF-8 ohne Stückliste?


818

Was ist anders zwischen UTF-8 und UTF-8 ohne Stückliste ? Welches ist besser?


77
UTF-8 kann vom Inhalt besser automatisch erkannt werden als von der Stückliste. Die Methode ist einfach: Versuchen Sie, die Datei (oder eine Zeichenfolge) als UTF-8 zu lesen. Wenn dies erfolgreich ist, nehmen Sie an, dass die Daten UTF-8 sind. Andernfalls wird davon ausgegangen, dass es sich um CP1252 (oder eine andere 8-Bit-Codierung) handelt. Jede Nicht-UTF-8-8-Bit-Codierung enthält mit ziemlicher Sicherheit Sequenzen, die von UTF-8 nicht zugelassen werden. Reines ASCII (7 Bit) wird als UTF-8 interpretiert, aber das Ergebnis ist auch auf diese Weise korrekt.
Tronic

39
Das Scannen großer Dateien nach UTF-8-Inhalten nimmt Zeit in Anspruch. Eine Stückliste beschleunigt diesen Vorgang erheblich. In der Praxis müssen Sie oft beides tun. Der Schuldige ist heutzutage, dass immer noch viel Textinhalt kein Unicode ist, und ich stoße immer noch auf Tools, die sagen, dass sie Unicode verwenden (zum Beispiel UTF-8), aber ihren Inhalt auf einer anderen Codepage ausgeben.
Jeroen Wiert Pluimers

10
@Tronic Ich denke nicht wirklich, dass "besser" in diesen Fall passt. Das hängt von der Umgebung ab. Wenn Sie sicher sind , dass alle UTF-8-Dateien mit einer Stückliste gekennzeichnet sind, ist die Überprüfung der Stückliste der "bessere" Weg, da sie schneller und zuverlässiger ist.
mg30rg

32
UTF-8 hat keine Stückliste. Wenn Sie einen U + FEFF-Codepunkt am Anfang einer UTF-8-Datei einfügen, muss besonders darauf geachtet werden, damit umzugehen. Dies ist nur eine dieser Microsoft-Namenslügen, wie das Aufrufen einer Codierung "Unicode", wenn es so etwas nicht gibt.
Tchrist

7
"Der moderne Mainframe (und AIX) ist Little Endian UTF-8 - fähig " UTF-8 hat keine Endigkeit ! Es gibt kein Mischen von Bytes, um Paare oder Vierergruppen in die richtige "Reihenfolge" für ein bestimmtes System zu bringen! Um eine UTF-8-Byte-Sequenz zu erkennen, kann es nützlich sein zu beachten, dass für das erste Byte eines "Codepunkts" einer Mehrbyte-Sequenz (die Bytes, die KEINE "einfachen" ASCII-Bytes sind) das MS-Bit gesetzt ist und alle ein bis drei weitere sukzessive weniger signifikante Bits, gefolgt von einem Rücksetzbit. Die Gesamtzahl dieser gesetzten Bits beträgt ein Byte weniger, die sich in diesem Codepunkt befinden, und für ALLE wird das MSB gesetzt ...
SlySven

Antworten:


773

Die UTF-8-Stückliste ist eine Folge von Bytes am Anfang eines Textstroms ( 0xEF, 0xBB, 0xBF), mit der der Leser eine Datei, die in UTF-8 codiert ist, zuverlässiger erraten kann.

Normalerweise wird die Stückliste verwendet, um die Endianness einer Codierung zu signalisieren , aber da Endianness für UTF-8 irrelevant ist, ist die Stückliste nicht erforderlich.

Gemäß dem Unicode-Standard wird die Stückliste für UTF-8-Dateien nicht empfohlen :

2.6 Codierungsschemata

... Die Verwendung einer Stückliste ist für UTF-8 weder erforderlich noch empfohlen. Sie kann jedoch in Kontexten auftreten, in denen UTF-8-Daten aus anderen Codierungsformen konvertiert werden, die eine Stückliste verwenden, oder in denen die Stückliste als UTF-8-Signatur verwendet wird . Weitere Informationen finden Sie im Unterabschnitt „Byte Order Mark“ in Abschnitt 16.8, Specials .


114
Es wird vielleicht nicht empfohlen, aber aus meiner Erfahrung mit Hebräisch-Konvertierungen ist die Stückliste manchmal entscheidend für die UTF-8-Erkennung in Excel und kann den Unterschied zwischen Jibrish und Hebräisch
ausmachen

26
Es ist vielleicht nicht zu empfehlen, aber es hat Wunder an meinem Powershell-Skript gewirkt, als ich versuchte, "æøå"
Marius

63
Unabhängig davon, ob es vom Standard nicht empfohlen wird, ist es zulässig, und ich bevorzuge es sehr, etwas als UTF-8-Signatur zu haben, anstatt die Alternativen des Annehmens oder Erraten. Unicode-kompatible Software sollte / muss in der Lage sein, mit ihrer Präsenz umzugehen, daher empfehle ich persönlich ihre Verwendung.
Martineau

30
@ bames53: Ja, in einer idealen Welt wäre das Speichern der Codierung von Textdateien als Metadaten des Dateisystems eine bessere Möglichkeit, diese beizubehalten. Aber die meisten von uns, die in der realen Welt leben, können das Dateisystem der Betriebssysteme, auf denen unsere Programme ausgeführt werden, nicht ändern. Daher scheint die Verwendung der plattformunabhängigen Stücklistensignatur des Unicode-Standards meiner Meinung nach die beste und praktischste Alternative zu sein.
Martineau

34
@martineau Erst gestern bin ich auf eine Datei mit einer UTF-8-Stückliste gestoßen, die nicht UTF-8 war (es war CP936). Was bedauerlich ist, ist, dass diejenigen, die für die immense Menge an Schmerzen verantwortlich sind, die durch die UTF-8-Stückliste verursacht werden, dies größtenteils nicht bemerken.
Bames53

243

Die anderen ausgezeichneten Antworten haben bereits geantwortet:

  • Es gibt keinen offiziellen Unterschied zwischen UTF-8 und BOM-ed UTF-8
  • Eine UTF-8-Zeichenfolge mit Stückliste beginnt mit den drei folgenden Bytes. EF BB BF
  • Diese Bytes müssen, falls vorhanden, beim Extrahieren der Zeichenfolge aus der Datei / dem Stream ignoriert werden.

Als zusätzliche Information dazu könnte die Stückliste für UTF-8 eine gute Möglichkeit sein, "zu riechen", wenn eine Zeichenfolge in UTF-8 codiert wurde ... oder eine legitime Zeichenfolge in einer anderen Codierung ...

Zum Beispiel könnten die Daten [EF BB BF 41 42 43] entweder sein:

  • Die legitime ISO-8859-1- Zeichenfolge "ï» ¿ABC "
  • Die legitime UTF-8- Zeichenfolge "ABC"

Obwohl es cool sein kann, die Codierung eines Dateiinhalts anhand der ersten Bytes zu erkennen, sollten Sie sich nicht darauf verlassen, wie das obige Beispiel zeigt

Kodierungen sollten bekannt und nicht göttlich sein.


60
@Alcott: Du hast richtig verstanden. Die Zeichenfolge [EF BB BF 41 42 43] besteht nur aus mehreren Bytes. Sie benötigen externe Informationen, um zu entscheiden, wie sie interpretiert werden sollen. Wenn Sie glauben, dass diese Bytes mit ISO-8859-1 codiert wurden, lautet die Zeichenfolge "ï» ¿ABC ". Wenn Sie glauben, dass diese Bytes mit UTF-8 codiert wurden, ist dies "ABC". Wenn Sie es nicht wissen, müssen Sie versuchen, es herauszufinden. Die Stückliste könnte ein Hinweis sein. Das Fehlen eines ungültigen Zeichens bei der Dekodierung als UTF-8 könnte ein anderes sein ... Letztendlich ist ein Array von Bytes nur ein Array von Bytes, es sei denn, Sie können sich die Codierung irgendwie merken / finden.
Paercebal

19
@paercebal Während "ï» ¿"für Latin-1 gültig ist, ist es sehr unwahrscheinlich, dass eine Textdatei mit dieser Kombination beginnt. Gleiches gilt für die ucs2-le / be-Marker ÿþ und þÿ. Auch kann man nie wissen.
user877329

16
@deceze Es ist wahrscheinlich sprachlich ungültig: Erst ï (was in Ordnung ist), dann ein Anführungszeichen ohne Leerzeichen dazwischen (nicht in Ordnung). ¿Gibt an, dass es Spanisch ist, aber ï wird nicht auf Spanisch verwendet. Schlussfolgerung: Es ist kein Latin-1 mit einer Sicherheit, die weit über der Sicherheit ohne es liegt.
user877329

20
@user Klar, das macht nicht unbedingt Sinn. Wenn Ihr System jedoch auf Vermutungen angewiesen ist, treten hier Unsicherheiten auf. Einige böswillige Benutzer senden absichtlich Text, der mit diesen drei Buchstaben beginnt, und Ihr System geht plötzlich davon aus, dass UTF-8 mit einer Stückliste betrachtet wird, und behandelt den Text als UTF-8, wobei Es sollte Latin-1 verwendet werden, und es findet eine Unicode-Injektion statt. Nur ein hypothetisches Beispiel, aber durchaus möglich. Sie können eine Textcodierung nicht nach Inhalt und Punkt beurteilen.
Täuschung

40
"Kodierungen sollten bekannt und nicht göttlich sein." Das Herz und die Seele des Problems. +1, guter Herr. Mit anderen Worten: Standardisieren Sie entweder Ihren Inhalt und sagen Sie: "Wir verwenden immer diese Codierung. Punkt. Schreiben Sie ihn so. Lesen Sie ihn so", oder entwickeln Sie ein erweitertes Format, in dem die Codierung als Metadaten gespeichert werden kann. (Letzteres benötigt wahrscheinlich auch eine "Bootstrap-Standardcodierung". Wie zum Beispiel "Der Teil, der Ihnen sagt, dass die Codierung immer ASCII ist.")
jpmc26

135

Es gibt mindestens drei Probleme beim Einfügen einer Stückliste in UTF-8-codierte Dateien.

  1. Dateien, die keinen Text enthalten, sind nicht mehr leer, da sie immer die Stückliste enthalten.
  2. Dateien, die Text enthalten, der sich in der ASCII-Teilmenge von UTF-8 befindet, sind nicht mehr selbst ASCII, da die Stückliste nicht ASCII ist, wodurch einige vorhandene Tools ausfallen und es für Benutzer möglicherweise unmöglich ist, solche älteren Tools zu ersetzen.
  3. Es ist nicht möglich, mehrere Dateien miteinander zu verketten, da jede Datei am Anfang eine Stückliste hat.

Und wie andere bereits erwähnt haben, ist es weder ausreichend noch notwendig, eine Stückliste zu haben, um festzustellen, dass es sich bei etwas um UTF-8 handelt:

  • Dies ist nicht ausreichend, da eine beliebige Bytesequenz mit der genauen Sequenz beginnen kann, aus der die Stückliste besteht.
  • Dies ist nicht erforderlich, da Sie die Bytes einfach so lesen können, als wären sie UTF-8. Wenn dies erfolgreich ist, ist es per Definition gültiges UTF-8.

8
Zu Punkt 1 "Dateien, die keinen Text enthalten, sind nicht mehr leer, da sie immer die Stückliste enthalten". Dies (1) verbindet die Ebene des Betriebssystem-Dateisystems mit der Ebene des interpretierten Inhalts, und es (2) geht fälschlicherweise davon aus, dass bei Verwendung der Stückliste eine gesetzt werden muss Stückliste auch in jeder ansonsten leeren Datei. Die praktische Lösung für (1) besteht darin, (2) nicht zu tun. Im Wesentlichen reduziert sich die Beschwerde auf "Es ist möglich, eine Stückliste unpraktisch in eine ansonsten leere Datei zu legen, wodurch die einfachste Erkennung logisch leerer Dateien (durch Überprüfen der Dateigröße) verhindert wird". Trotzdem sollte gute Software damit umgehen können, da sie einen Zweck hat.
Prost und hth. - Alf

7
Zu Punkt 2, "Dateien, die ASCII-Text enthalten, sind nicht mehr selbst ASCII", wird ASCII mit UTF-8 zusammengeführt. Eine UTF-8-Datei, die ASCII-Text enthält, ist nicht ASCII, sondern UTF-8. Ebenso ist eine UTF-16-Datei, die ASCII-Text enthält, nicht ASCII, sondern UTF-16. Und so weiter. ASCII ist ein 7-Bit-Einzelbytecode. UTF-8 ist eine 8-Bit-Erweiterung mit variabler Länge von ASCII. Wenn "Werkzeuge aufgrund von> 127 Werten ausfallen", sind sie einfach nicht für eine 8-Bit-Welt geeignet. Eine einfache praktische Lösung besteht darin, nur ASCII-Dateien mit Tools zu verwenden, die nach Nicht-ASCII-Bytewerten aufgeschlüsselt sind. Eine wahrscheinlich bessere Lösung besteht darin, diese nicht guten Werkzeuge wegzuwerfen.
Prost und hth. - Alf

8
Zu Punkt 3, "Es ist nicht möglich, mehrere Dateien miteinander zu verketten, da jede Datei jetzt am Anfang eine Stückliste hat", ist einfach falsch. Ich habe kein Problem damit, UTF-8-Dateien mit Stücklisten zu verketten, daher ist dies eindeutig möglich. Ich denke, vielleicht haben Sie gemeint, dass das Unix-Land catIhnen kein sauberes Ergebnis liefert, ein Ergebnis, das nur zu Beginn eine Stückliste enthält. Wenn Sie das so gemeint haben, dann liegt das daran, dass es catauf Byte-Ebene arbeitet, nicht auf der Ebene des interpretierten Inhalts, und auf ähnliche Weise beispielsweise catnicht mit Fotos umgehen kann. Trotzdem schadet es nicht viel. Dies liegt daran, dass die Stückliste einen nicht unterbrechenden Bereich mit einer Breite von Null codiert.
Prost und hth. - Alf

20
@ Cheersandhth.-Alf Diese Antwort ist richtig. Sie weisen lediglich auf Microsoft-Fehler hin.
Tchrist

9
@brighty: Die Situation wird durch das Hinzufügen einer Bombe nicht verbessert.
Deduplikator

84

Hier sind Beispiele für die Verwendung von Stücklisten, die tatsächlich echte Probleme verursachen, und dennoch wissen viele Menschen nichts davon.

Stückliste bricht Skripte

Shell-Skripte, Perl-Skripte, Python-Skripte, Ruby-Skripte, Node.js-Skripte oder andere ausführbare Dateien, die von einem Interpreter ausgeführt werden müssen - alle beginnen mit einer Shebang-Zeile, die wie eine der folgenden aussieht:

#!/bin/sh
#!/usr/bin/python
#!/usr/local/bin/perl
#!/usr/bin/env node

Es teilt dem System mit, welcher Interpreter beim Aufrufen eines solchen Skripts ausgeführt werden muss. Wenn das Skript in UTF-8 codiert ist, könnte man versucht sein, am Anfang eine Stückliste einzuschließen. Aber eigentlich das "#!" Zeichen sind nicht nur Zeichen. Sie sind in der Tat eine magische Zahl , die zufällig aus zwei ASCII-Zeichen besteht. Wenn Sie diesen Zeichen etwas (wie eine Stückliste) vorlegen, sieht die Datei so aus, als hätte sie eine andere magische Zahl, was zu Problemen führen kann.

Siehe Wikipedia, Artikel: Shebang, Abschnitt: Magische Nummer :

Die Shebang-Zeichen werden in erweiterten ASCII-Codierungen, einschließlich UTF-8, das üblicherweise für Skripte und andere Textdateien auf aktuellen Unix-ähnlichen Systemen verwendet wird, durch dieselben zwei Bytes dargestellt. UTF-8-Dateien können jedoch mit dem optionalen Byte Order Mark (BOM) beginnen. Wenn die Funktion "exec" die Bytes 0x23 und 0x21 spezifisch erkennt, verhindert das Vorhandensein der Stückliste (0xEF 0xBB 0xBF) vor dem Shebang, dass der Skriptinterpreter ausgeführt wird.Einige Behörden raten aus diesem Grund und aus Gründen der Interoperabilität und aus philosophischen Gründen davon ab, das Byte-Ordnungszeichen in POSIX-Skripten (Unix-ähnlichen Skripten) [14] zu verwenden. Darüber hinaus ist in UTF-8 keine Bytereihenfolge erforderlich, da diese Codierung keine Endianness-Probleme aufweist. Es dient nur dazu, die Codierung als UTF-8 zu identifizieren. [Betonung hinzugefügt]

Stückliste ist in JSON illegal

Siehe RFC 7159, Abschnitt 8.1 :

Implementierungen dürfen am Anfang eines JSON-Textes KEINE Byte-Ordnungsmarke hinzufügen.

Stückliste ist in JSON redundant

Es ist nicht nur in JSON illegal , es wird auch nicht benötigt , um die Zeichenkodierung zu bestimmen, da es zuverlässigere Möglichkeiten gibt, sowohl die Zeichenkodierung als auch die Endianness, die in einem JSON-Stream verwendet werden, eindeutig zu bestimmen ( Einzelheiten finden Sie in dieser Antwort ).

Stückliste bricht JSON-Parser

Es ist nicht nur in JSON illegal und wird nicht benötigt , es bricht auch die gesamte Software , die die Codierung mithilfe der in RFC 4627 vorgestellten Methode ermittelt :

Bestimmen der Codierung und Endianness von JSON, Untersuchen der ersten vier Bytes für das NUL-Byte:

00 00 00 xx - UTF-32BE
00 xx 00 xx - UTF-16BE
xx 00 00 00 - UTF-32LE
xx 00 xx 00 - UTF-16LE
xx xx xx xx - UTF-8

Wenn die Datei mit Stückliste beginnt, sieht sie folgendermaßen aus:

00 00 FE FF - UTF-32BE
FE FF 00 xx - UTF-16BE
FF FE 00 00 - UTF-32LE
FF FE xx 00 - UTF-16LE
EF BB BF xx - UTF-8

Beachten Sie, dass:

  1. UTF-32BE startet nicht mit drei NULs, daher wird es nicht erkannt
  2. UTF-32LE Auf das erste Byte folgen nicht drei NULs, daher wird es nicht erkannt
  3. UTF-16BE hat nur eine NUL in den ersten vier Bytes, daher wird es nicht erkannt
  4. UTF-16LE hat nur eine NUL in den ersten vier Bytes, daher wird es nicht erkannt

Abhängig von der Implementierung werden alle möglicherweise falsch als UTF-8 interpretiert und dann falsch interpretiert oder als ungültiges UTF-8 abgelehnt oder überhaupt nicht erkannt.

Wenn die Implementierung auf gültiges JSON testet, wie ich es empfehle, lehnt sie sogar die Eingabe ab, die tatsächlich als UTF-8 codiert ist, da sie nicht mit einem ASCII-Zeichen <128 beginnt, wie es laut RFC sein sollte.

Andere Datenformate

Stückliste in JSON wird nicht benötigt, ist illegal und bricht Software, die gemäß RFC ordnungsgemäß funktioniert. Es sollte ein Nobrainer sein, es dann einfach nicht zu verwenden, und dennoch gibt es immer Leute, die darauf bestehen, JSON durch Verwendung von Stücklisten, Kommentaren, unterschiedlichen Anführungsregeln oder unterschiedlichen Datentypen zu brechen. Natürlich kann jeder Dinge wie Stücklisten oder irgendetwas anderes verwenden, wenn Sie es brauchen - nennen Sie es dann einfach nicht JSON.

Sehen Sie sich für andere Datenformate als JSON an, wie es wirklich aussieht. Wenn die einzigen Codierungen UTF- * sind und das erste Zeichen ein ASCII-Zeichen unter 128 sein muss, verfügen Sie bereits über alle Informationen, die erforderlich sind, um sowohl die Codierung als auch die Endianität Ihrer Daten zu bestimmen. Das Hinzufügen von Stücklisten, auch als optionale Funktion, würde es nur komplizierter und fehleranfälliger machen.

Andere Verwendungen von Stücklisten

Was die Verwendung außerhalb von JSON oder Skripten betrifft, denke ich, dass es hier bereits sehr gute Antworten gibt. Ich wollte detailliertere Informationen speziell zu Skripten und Serialisierung hinzufügen, da dies ein Beispiel für Stücklistenzeichen ist, die echte Probleme verursachen.


5
rfc7159, das rfc4627 ersetzt, deutet tatsächlich darauf hin, dass die Unterstützung von Stücklisten möglicherweise nicht so böse ist. Grundsätzlich ist das Fehlen einer Stückliste nur ein zweideutiger Fehler, sodass alte Windows- und Unix-Software, die nicht Unicode-fähig sind, utf-8 weiterhin verarbeiten können.
Eric Grange

2
Klingt so, als müsste JSON aktualisiert werden, um dies zu unterstützen, genau wie bei Perl-Skripten, Python-Skripten, Ruby-Skripten und Node.js. Nur weil diese Plattformen sich dafür entschieden haben, keine Unterstützung zu bieten, wird die Verwendung für Stücklisten nicht unbedingt beendet. Apple versucht seit einigen Jahren, Adobe zu töten, und Adobe gibt es immer noch. Aber ein aufschlussreicher Beitrag.
htm11h

13
@EricGrange, Sie scheinen die Stückliste sehr stark zu unterstützen, aber Sie wissen nicht, dass dies das allgegenwärtige, universell nützliche und optimale Minimum an "Klartext" -Format zu einem Relikt der Vergangenheit vor UTF8 machen würde! Das Hinzufügen einer Art (In-Band-) Header zum Nur- Text-Stream würde per Definition den einfachsten Textdateien ein obligatorisches Protokoll auferlegen , was es nie wieder zum "einfachsten" macht! Und zu welchem ​​Vorteil? Um alle anderen alten CP-Codierungen zu unterstützen, die ebenfalls keine Signaturen hatten, könnten Sie sie also mit UTF-8 verwechseln? (Übrigens ist ASCII auch UTF-8. Also auch eine Stückliste für diese ?;) Komm schon.)
Gr.

2
Diese Antwort ist der Grund, warum ich auf diese Frage gekommen bin! Ich erstelle meine Bash-Skripte unter Windows und habe viele Probleme beim Veröffentlichen dieser Skripte unter Linux! Gleiches gilt für Jason-Dateien.
Tono Nam

2
Ich wünschte, ich könnte diese Antwort ungefähr fünfzig Mal abstimmen. Ich möchte auch hinzufügen, dass UTF-8 zu diesem Zeitpunkt den Standardkrieg gewonnen hat und fast der gesamte im Internet produzierte Text UTF-8 ist. Einige der beliebtesten Programmiersprachen (wie C # und Java) verwenden UTF-16 intern, aber wenn Programmierer, die diese Sprachen verwenden, Dateien schreiben, um Streams auszugeben, codieren sie diese fast immer als UTF-8. Daher ist es nicht mehr sinnvoll, eine Stückliste zum Markieren einer UTF-8-Datei zu haben. UTF-8 sollte die Standardeinstellung sein, die Sie beim Lesen verwenden, und andere Codierungen nur versuchen, wenn die UTF-8-Decodierung fehlschlägt.
Montag,

51

Was ist anders zwischen UTF-8 und UTF-8 ohne Stückliste?

Kurze Antwort: In UTF-8 wird eine Stückliste als Byte EF BB BFam Anfang der Datei codiert .

Lange Antwort:

Ursprünglich wurde erwartet, dass Unicode in UTF-16 / UCS-2 codiert wird. Die Stückliste wurde für diese Codierungsform entwickelt. Wenn Sie 2-Byte-Codeeinheiten haben, müssen Sie angeben, in welcher Reihenfolge sich diese beiden Bytes befinden, und eine übliche Konvention besteht darin, das Zeichen U + FEFF als "Byte Order Mark" am Anfang der Daten einzufügen. Das Zeichen U + FFFE ist permanent nicht zugewiesen, sodass seine Anwesenheit verwendet werden kann, um die falsche Bytereihenfolge zu erkennen.

UTF-8 hat unabhängig von der Plattformendigkeit dieselbe Bytereihenfolge, sodass keine Bytereihenfolge erforderlich ist. Es kann jedoch (als Bytesequenz EF BB FF) in Daten auftreten, die von UTF-16 in UTF-8 konvertiert wurden, oder als "Signatur", um anzuzeigen, dass die Daten UTF-8 sind.

Welches ist besser?

Ohne. Wie Martin Cote antwortete, empfiehlt der Unicode-Standard dies nicht. Dies führt zu Problemen mit nicht Stücklistenfähiger Software.

Eine bessere Möglichkeit, festzustellen, ob eine Datei UTF-8 ist, besteht darin, eine Gültigkeitsprüfung durchzuführen. UTF-8 hat strenge Regeln darüber, welche Byte-Sequenzen gültig sind, sodass die Wahrscheinlichkeit eines falsch positiven Ergebnisses vernachlässigbar ist. Wenn eine Byte-Sequenz wie UTF-8 aussieht, ist dies wahrscheinlich der Fall.


8
Dies würde auch gültiges UTF-8 mit einem einzelnen fehlerhaften Byte ungültig machen, obwohl: /
Endolith

8
-1 re "Es verursacht Probleme mit nicht Stücklisten-fähiger Software.", Das war für mich nie ein Problem, aber im Gegenteil, das Fehlen von Stücklisten verursacht Probleme mit Stücklisten-fähiger Software (insbesondere Visual C ++) Problem. Diese Aussage ist also sehr plattformspezifisch , eine enge Unix-Land-Sichtweise, wird aber irreführend dargestellt, als ob sie allgemein gilt. Was es nicht tut.
Prost und hth. - Alf

6
Nein, UTF-8 hat keine Stückliste. Diese Antwort ist falsch. Siehe den Unicode-Standard.
Tchrist

2
Sie können sogar denken, dass Sie eine reine ASCII-Datei haben, wenn Sie nur die Bytes betrachten. Dies könnte aber auch eine utf-16-Datei sein, in der Sie sich Wörter und nicht Bytes ansehen müssen. Moderne Software sollte sich der Stücklisten bewusst sein. Das Lesen von utf-8 kann weiterhin fehlschlagen, wenn ungültige Sequenzen, Codepunkte, die eine kleinere Sequenz verwenden können, oder Codepunkte, die Ersatz sind, erkannt werden. Bei utf-16 kann das Lesen auch fehlschlagen, wenn verwaiste Ersatzzeichen vorhanden sind.
hell

1
@Alf, ich bin nicht einverstanden mit Ihrer Interpretation einer Nicht-Stücklisten-Einstellung als " plattformspezifisch , ein enger Unix-Land-Standpunkt". Für mich war die einzige Möglichkeit, dass die Engstirnigkeit bei "Unix Land" liegen könnte, wenn MS und Visual C ++ vor * NIX kamen, was sie nicht taten. Die Tatsache , dass MS (ich nehme wissentlich) begann eine BOM in UTF-8 anstatt UTF-16 mit suggeriert mir , dass Sie förderten brechen sh, perl, g++, und viele andere freie und leistungsfähige Werkzeuge. Möchten Sie, dass die Dinge funktionieren? Kaufen Sie einfach die MS-Versionen. MS hat das plattformspezifische Problem geschaffen, genau wie die Katastrophe in ihrem Bereich \ x80- \ x95.
bballdave025

30

UTF-8 mit Stückliste ist besser zu identifizieren. Ich bin auf die harte Tour 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 Stückliste gespeichert wird, hält Excel sie für ANSI und zeigt Kauderwelsch an. Sobald Sie vorne "EF BB BF" hinzugefügt haben (z. B. durch erneutes Speichern mit Notepad mit UTF-8 oder Notepad ++ mit UTF-8 mit Stückliste), wird es von Excel problemlos geöffnet.

Das Voranstellen des Stücklistenzeichens für Unicode-Textdateien wird von RFC 3629 empfohlen: "UTF-8, ein Transformationsformat von ISO 10646", November 2003 unter http://tools.ietf.org/html/rfc3629 (diese letzten Informationen finden Sie unter: http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html )


6
Vielen Dank für diesen hervorragenden Tipp für den Fall, dass UTF-8-Dateien zur Verwendung durch Excel erstellt werden. Unter anderen Umständen würde ich trotzdem den anderen Antworten folgen und die Stückliste überspringen.
Barfuin

5
Dies ist auch nützlich, wenn Sie Dateien erstellen, die nur ASCII und höher enthalten und möglicherweise Nicht-ASCII hinzugefügt wurden. Ich bin gerade auf ein solches Problem gestoßen: Software, die utf8 erwartet, erstellt eine Datei mit einigen Daten zur Benutzerbearbeitung. Wenn die ursprüngliche Datei nur ASCII enthält, in einigen Editoren geöffnet und dann gespeichert wird, endet sie in Latin-1 und alles bricht zusammen. Wenn ich die Stückliste hinzufüge, wird sie vom Editor als UTF8 erkannt und alles funktioniert.
Roberto Alsina

1
Ich habe mehrere programmierbezogene Tools gefunden, bei denen die Stückliste UTF-8-Dateien korrekt erkennen muss. Visual Studio, SSMS, SoureTree ....
kjbartel

5
Wo lesen Sie eine Empfehlung für die Verwendung einer Stückliste in diesem RFC? Es gibt höchstens eine starke Empfehlung, es unter bestimmten Umständen nicht zu verbieten, wenn dies schwierig ist.
Deduplikator

8
Excel hält es für ANSI und zeigt Kauderwelsch an, dann liegt das Problem in Excel.
Isaac

17

Stückliste neigt dazu, irgendwo irgendwo zu boomen (kein Wortspiel beabsichtigt). Und wenn es boomt (z. B. von Browsern, Editoren usw. nicht erkannt wird), werden die seltsamen Zeichen am Anfang des Dokuments angezeigt (z. B. HTML-Datei, JSON- Antwort, RSS usw.). und verursacht die Art von Verlegenheiten wie das jüngste Kodierungsproblem, das während des Gesprächs von Obama auf Twitter aufgetreten ist .

Es ist sehr ärgerlich, wenn es an schwer zu debuggenden Stellen angezeigt wird oder wenn das Testen vernachlässigt wird. Vermeiden Sie es am besten, es sei denn, Sie müssen es verwenden.


Ja, ich habe nur Stunden damit verbracht, ein Problem zu identifizieren, das dadurch verursacht wurde, dass eine Datei als UTF-8 anstelle von UTF-8 ohne Stückliste codiert wurde. (Das Problem tauchte nur in IE7 auf, was mich zu einer ziemlichen
Gänsejagd

Zukünftige Leser: Beachten Sie, dass das oben erwähnte Tweet-Problem nicht ausschließlich mit der Stückliste zusammenhängt. Wenn dies jedoch der Fall ist, wird der Tweet auf ähnliche Weise verstümmelt, jedoch zu Beginn des Tweets.
Halil Özgür

12
@ user984003 Nein, das Problem ist, dass Microsoft Sie irregeführt hat. Was es UTF-8 nennt, ist nicht UTF-8. Was es UTF-8 ohne Stückliste nennt, ist das, was UTF-8 wirklich ist.
Tchrist

Was fügt das "sic" zu Ihrem "kein Wortspiel beabsichtigt" hinzu
JoelFan

2
@ JoelFan Ich kann mich nicht mehr erinnern, aber ich denke, das Wortspiel könnte trotz der Behauptung des Autors beabsichtigt gewesen sein :)
Halil Özgür

17

Frage: Was unterscheidet UTF-8 und UTF-8 ohne Stückliste? Welches ist besser?

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

Zur Bedeutung von Stückliste und UTF-8:

Der Unicode-Standard erlaubt die Stückliste in UTF-8 , erfordert oder empfiehlt jedoch nicht deren Verwendung. Die Bytereihenfolge hat in UTF-8 keine Bedeutung, daher wird sie in UTF-8 nur verwendet, um zu Beginn zu signalisieren, dass der Textstrom in UTF-8 codiert ist.

Argument für die NICHT- Verwendung einer Stückliste:

Die Hauptmotivation für die Nichtverwendung einer Stückliste ist die Abwärtskompatibilität mit Software, die nicht Unicode-fähig ist. Eine weitere Motivation für die Nichtverwendung einer Stückliste besteht darin, UTF-8 als "Standard" -Codierung zu empfehlen.

Argument für die Verwendung einer Stückliste:

Das Argument für die Verwendung einer Stückliste ist, dass ohne sie eine heuristische Analyse erforderlich ist, um festzustellen, welches Zeichen eine Datei codiert. Historisch gesehen ist eine solche Analyse zur Unterscheidung verschiedener 8-Bit-Codierungen kompliziert, fehleranfällig und manchmal langsam. Zur Erleichterung der Aufgabe stehen eine Reihe von Bibliotheken zur Verfügung, z. B. Mozilla Universal Charset Detector und International Components for Unicode.

Programmierer gehen fälschlicherweise davon aus, dass die Erkennung von UTF-8 gleichermaßen schwierig ist (dies liegt nicht daran, dass die überwiegende Mehrheit der Byte-Sequenzen ungültig ist, während die Codierungen, die diese Bibliotheken zu unterscheiden versuchen, alle möglichen Byte-Sequenzen zulassen). Daher führen nicht alle Unicode-fähigen Programme eine solche Analyse durch und verlassen sich stattdessen auf die Stückliste.

Insbesondere Microsoft- Compiler und -Interpreter sowie viele Softwareteile unter Microsoft Windows wie Notepad lesen UTF-8-Text nur dann korrekt, wenn er nur ASCII-Zeichen enthält oder mit der Stückliste beginnt, und fügen beim Speichern beim Start eine Stückliste hinzu Text als UTF-8. Google Text & Tabellen fügt eine Stückliste hinzu, wenn ein Microsoft Word-Dokument als reine Textdatei heruntergeladen wird.

Auf dem ist besser, MIT Was oder OHNE Stückliste:

Die IETF empfiehlt, dass, wenn ein Protokoll entweder (a) immer UTF-8 verwendet oder (b) auf andere Weise angibt, welche Codierung verwendet wird, „die Verwendung von U + FEFF als Signatur verboten werden sollte“.

Meine Schlussfolgerung:

Verwenden Sie die Stückliste nur, wenn die Kompatibilität mit einer Softwareanwendung unbedingt erforderlich ist.

Beachten Sie auch, dass der referenzierte Wikipedia-Artikel angibt, dass viele Microsoft-Anwendungen auf die Stückliste angewiesen sind, um UTF-8 korrekt zu erkennen. Dies ist jedoch nicht bei allen Microsoft-Anwendungen der Fall . Wie beispielsweise von @barlop ausgeführt , können bei Verwendung der Windows-Eingabeaufforderung mit UTF-8 Befehle wie ztype und morees wird nicht erwartet, dass die Stückliste vorhanden ist. Wenn die Stückliste ist vorhanden, kann es problematisch sein , wie es für andere Anwendungen ist.


† Der chcpBefehl bietet Unterstützung für UTF-8 ( ohne Stückliste) über die Codepage 65001 .


5
Ich sollte mich lieber auf OHNE Stückliste beschränken . Ich fand, dass .htaccessund gzip compressionin Kombination mit UTF-8 Stückliste einen Codierungsfehler ergibt. Ändern Sie die Codierung in UTF-8 ohne Stückliste.
Folgen Sie

1
"Eine weitere Motivation, keine Stückliste zu verwenden, besteht darin, UTF-8 als" Standard "-Codierung zu verwenden." - Was ein so starkes und gültiges Argument ist, dass Sie die Antwort dort tatsächlich hätten stoppen können! ...; -o Es sei denn, Sie hätten eine bessere Idee für die universelle Textdarstellung. ;) (Ich weiß nicht, wie alt du bist, wie viele Jahre du in der Zeit vor UTF8 leiden musstest (als Linguisten verzweifelt darüber nachdachten, ihre Alphabete zu ändern), aber ich kann dir sagen, dass wir uns mit jeder Sekunde dem Befreien nähern Das Durcheinander aller alten Einzelbyte-Codierungen ohne Metadaten, anstatt "die eine" zu haben, ist pure Freude.)
Sz.

Siehe auch diesen Kommentar darüber, wie das Hinzufügen einer Stückliste (oder etwas anderem!) Zu den einfachsten Textdateiformaten, "Nur-Text", bedeuten würde, dass verhindert wird, dass genau das beste universelle Textcodierungsformat "Einfach" und "Einfach" (dh) ist "Overheadless")! ...
Gr.

Stücklisten sind unter Linux meistens problematisch, da viele Dienstprogramme Unicode zunächst nicht wirklich unterstützen (sie werden beispielsweise gerne mitten in Codepunkten abgeschnitten). Verwenden Sie für die meisten anderen modernen Softwareumgebungen Stücklisten, wenn die Codierung nicht eindeutig ist (über Spezifikationen oder Metadaten).
Eric Grange

9

Diese Frage hat bereits eine Million und eine Antwort und viele davon sind ziemlich gut, aber ich wollte versuchen zu klären, wann eine Stückliste verwendet werden sollte oder nicht.

Wie bereits erwähnt, ist jede Verwendung der UTF-Stückliste (Byte Order Mark) zur Bestimmung, ob eine Zeichenfolge UTF-8 ist oder nicht, eine fundierte Vermutung. Wenn geeignete Metadaten verfügbar sind (wie charset="utf-8"), wissen Sie bereits, was Sie verwenden sollen, andernfalls müssen Sie einige Annahmen testen und treffen. Dies beinhaltet die Überprüfung, ob die Datei, aus der eine Zeichenfolge stammt, mit dem hexadezimalen Bytecode EF BB BF beginnt.

Wenn ein Bytecode gefunden wird, der der UTF-8-Stückliste entspricht, ist die Wahrscheinlichkeit hoch genug, um anzunehmen, dass es sich um UTF-8 handelt, und Sie können von dort aus fortfahren. Wenn Sie jedoch gezwungen sind, diese Vermutung anzustellen, ist eine zusätzliche Fehlerprüfung beim Lesen immer noch eine gute Idee, falls etwas verstümmelt auftaucht. Sie sollten nur annehmen, dass eine Stückliste nicht UTF-8 (dh Latin-1 oder ANSI) ist, wenn die Eingabe definitiv nicht sein sollte basierend auf ihrer Quelle UTF-8 sein sollte. Wenn jedoch keine Stückliste vorhanden ist, können Sie einfach feststellen, ob es sich um UTF-8 handeln soll, indem Sie anhand der Codierung validieren.

Warum wird eine Stückliste nicht empfohlen?

  1. Nicht Unicode-fähige oder schlecht kompatible Software kann davon ausgehen, dass es sich um Latin-1 oder ANSI handelt, und entfernt die Stückliste nicht von der Zeichenfolge, was offensichtlich zu Problemen führen kann.
  2. Es wird nicht wirklich benötigt (überprüfen Sie einfach, ob der Inhalt kompatibel ist, und verwenden Sie immer UTF-8 als Ersatz, wenn keine kompatible Codierung gefunden werden kann).

Wann sollten Sie mit einer Stückliste codieren?

Wenn Sie die Metadaten nicht auf andere Weise aufzeichnen können (über ein Zeichensatz-Tag oder ein Dateisystem-Meta) und die Programme wie Stücklisten verwendet werden, sollten Sie mit einer Stückliste codieren. Dies gilt insbesondere für Windows, bei dem allgemein angenommen wird, dass für alles ohne Stückliste eine ältere Codepage verwendet wird. Die Stückliste teilt Programmen wie Office mit, dass der Text in dieser Datei Unicode ist. Hier ist die verwendete Codierung.

Wenn es darauf ankommt, sind die einzigen Dateien, mit denen ich jemals wirklich Probleme habe, CSV. Je nach Programm muss eine Stückliste vorhanden sein oder nicht. Wenn Sie beispielsweise Excel 2007+ unter Windows verwenden, muss es mit einer Stückliste codiert werden, wenn Sie es reibungslos öffnen möchten und nicht auf den Import der Daten zurückgreifen müssen.


2
Der letzte Abschnitt Ihrer Antwort ist zu 100% korrekt: Der einzige Grund für die Verwendung einer Stückliste besteht darin, dass Sie mit fehlerhafter Software zusammenarbeiten müssen, die UTF-8 nicht als Standard zum Parsen unbekannter Dateien verwendet.
Montag,

8

Es ist zu beachten, dass für einige Dateien die Stückliste auch unter Windows nicht vorhanden sein darf . Beispiele sind SQL*plusoder VBScriptDateien. Wenn solche Dateien eine Stückliste enthalten, wird beim Versuch, sie auszuführen, eine Fehlermeldung angezeigt.


8

UTF-8 mit Stückliste hilft nur, wenn die Datei tatsächlich einige Nicht-ASCII-Zeichen enthält. Wenn es enthalten ist und es keine gibt, werden möglicherweise ältere Anwendungen beschädigt, die die Datei sonst als einfaches ASCII interpretiert hätten. Diese Anwendungen schlagen definitiv fehl, wenn sie auf ein Nicht-ASCII-Zeichen stoßen. Daher sollte die Stückliste meiner Meinung nach nur hinzugefügt werden, wenn die Datei nicht mehr als einfaches ASCII-Zeichen interpretiert werden kann und sollte.

Ich möchte klarstellen, dass ich die Stückliste lieber gar nicht habe. Fügen Sie es hinzu, wenn ein alter Müll ohne ihn kaputt geht und das Ersetzen dieser alten Anwendung nicht möglich ist.

Erwarten Sie keine Stückliste für UTF-8.


7

Zitiert am Ende der Wikipedia-Seite in der Stückliste: http://en.wikipedia.org/wiki/Byte-order_mark#cite_note-2

"Die Verwendung einer Stückliste ist für UTF-8 weder erforderlich noch empfohlen. Sie kann jedoch in Kontexten auftreten, in denen UTF-8-Daten aus anderen Codierungsformen konvertiert werden, die eine Stückliste verwenden, oder in denen die Stückliste als UTF-8-Signatur verwendet wird."


2
Haben Sie ein Beispiel, in dem Software eine Entscheidung darüber trifft, ob UTF-8 mit / ohne Stückliste verwendet wird, basierend darauf, ob die vorherige Codierung, aus der sie codiert, eine Stückliste hatte oder nicht?! Das scheint eine absurde Behauptung zu sein
Barlop

7

UTF-8 ohne Stückliste hat keine Stückliste, was es nicht besser macht als UTF-8 mit Stückliste, es sei denn, der Verbraucher der Datei muss wissen (oder würde davon profitieren), ob die Datei UTF-8-codiert ist oder nicht.

Die Stückliste ist normalerweise nützlich, um die Endiannität der Codierung zu bestimmen, die für die meisten Anwendungsfälle nicht erforderlich ist.

Außerdem kann die Stückliste für Verbraucher, die sie nicht kennen oder sich nicht darum kümmern, unnötige Geräusche / Schmerzen verursachen und zu Verwirrung bei den Benutzern führen.


2
"Das hat keine Verwendung für UTF-8, da es sowieso 8-Bit pro Glyphe ist." Äh ... nein, nur ASCII-7-Glyphen sind in UTF-8 8-Bit. Alles darüber hinaus wird 16, 24 oder 32 Bit sein.
Powerlord

3
"Die Stückliste ist normalerweise nützlich, um die Endianness der Codierung zu bestimmen, die für die meisten Anwendungsfälle nicht erforderlich ist." ... Endianness gilt einfach nicht für UTF-8, unabhängig vom Anwendungsfall
JoelFan

6

Ich betrachte das aus einer anderen Perspektive. Ich denke, UTF-8 mit Stückliste ist besser, da es mehr Informationen über die Datei bietet. Ich verwende UTF-8 ohne Stückliste nur, wenn ich Probleme habe.

Ich verwende auf meinen Seiten seit langer Zeit mehrere Sprachen (sogar kyrillisch ). Wenn die Dateien ohne Stückliste gespeichert werden und ich sie zur Bearbeitung mit einem Editor erneut öffne (wie auch Cherouvim feststellte), sind einige Zeichen beschädigt.

Beachten Sie, dass der klassische Editor von Windows Dateien automatisch mit einer Stückliste speichert, wenn Sie versuchen, eine neu erstellte Datei mit UTF-8-Codierung zu speichern.

Ich persönlich speichere serverseitige Skriptdateien (.asp, .ini, .aspx) mit Stücklisten- und .html-Dateien ohne Stückliste .


4
Vielen Dank für den hervorragenden Tipp zu Windows Classic Notepad. Ich habe schon einige Zeit damit verbracht, genau das Gleiche herauszufinden. Meine Konsequenz war, immer Notepad ++ anstelle von Windows Classic Notepad zu verwenden. :-)
Barfuin

Verwenden Sie besser madedit. Es ist der einzige Editor, der im Hex-Modus ein Zeichen anzeigt, wenn Sie eine utf-8-Byte-Sequenz anstelle einer 1: 1-Basis zwischen Byte und Zeichen auswählen. Ein Hex-Editor, der über eine UTF-8-Datei informiert ist, sollte wie madedit funktionieren!
hell

@brighty Ich glaube nicht, dass du eins zu eins für die Stückliste brauchst. es spielt keine Rolle, es braucht nicht viel, um zu erkennen, dass eine utf-8-Stückliste efbbbf oder fffe ist (von fffe, wenn falsch gelesen). Man kann diese Bytes einfach löschen. Es ist zwar nicht schlecht, eine Zuordnung für den Rest der Datei zu haben, aber auch Byte für Byte löschen zu können
Barlop

@barlop Warum sollten Sie eine utf-8-Stückliste löschen, wenn der Inhalt der Datei utf-8-codiert ist? Die Stückliste wird von modernen Textbetrachtern, Textsteuerelementen sowie Texteditoren erkannt. Eine Eins-zu-Eins-Ansicht einer utf-8-Sequenz macht keinen Sinn, da n Bytes zu einem Zeichen führen. Natürlich sollte ein Texteditor oder Hex-Editor das Löschen von Bytes ermöglichen, aber dies kann zu ungültigen utf-8-Sequenzen führen.
hell

@brighty utf-8 mit bom ist eine Codierung, und utf-8 ohne bom ist eine Codierung. Die Eingabeaufforderung cmd verwendet utf8 ohne bom. Wenn Sie also eine utf8-Datei haben, führen Sie den Befehl chcp 65001für die utf8-Unterstützung aus. Es ist utf8 ohne bom. Wenn Sie dies tun type myfile, wird es nur dann richtig angezeigt, wenn keine Bom vorhanden ist. Wenn Sie die Zeichen in die Datei aa ausgeben echo aaa>a.aoder echo אאא>a.achcp 65001 haben, wird sie ohne Stückliste ausgegeben.
Barlop

6

Wenn Sie in UTF-8 codierte Informationen anzeigen möchten, treten möglicherweise keine Probleme auf. Wenn Sie beispielsweise ein HTML-Dokument als UTF-8 deklarieren, wird in Ihrem Browser alles angezeigt, was im Hauptteil des Dokuments enthalten ist.

Dies ist jedoch nicht der Fall, wenn wir Text-, CSV- und XML-Dateien haben, weder unter Windows noch unter Linux.

Zum Beispiel ist eine Textdatei unter Windows oder Linux, eines der einfachsten Dinge, die man sich vorstellen kann, (normalerweise) nicht UTF-8.

Speichern Sie es als XML und deklarieren Sie es als UTF-8:

<?xml version="1.0" encoding="UTF-8"?>

Es wird nicht korrekt angezeigt (es wird nicht gelesen), selbst wenn es als UTF-8 deklariert ist.

Ich hatte eine Datenfolge mit französischen Buchstaben, die für die Syndizierung als XML gespeichert werden musste. Ohne von Anfang an eine UTF-8-Datei zu erstellen (Optionen in IDE und "Neue Datei erstellen" ändern) oder die Stückliste am Anfang der Datei hinzuzufügen

$file="\xEF\xBB\xBF".$string;

Ich konnte die französischen Buchstaben nicht in einer XML-Datei speichern.


1
FTM, in XML, ich denke, Sie sollten die Datei als ASCII behalten und stattdessen Entitäten verwenden.
Alois Mahdal

4
Ich weiß, dass dies eine alte Antwort ist, aber ich möchte nur erwähnen, dass es falsch ist. Textdateien unter Linux (können nicht für andere Unixe sprechen) sind normalerweise / are / UTF-8.
Functino

6

Ein praktischer Unterschied besteht darin, dass Sie die Antwort erhalten, wenn Sie ein Shell-Skript für Mac OS X schreiben und es als einfaches UTF-8 speichern:

#!/bin/bash: No such file or directory

als Antwort auf die Shebang-Zeile, die angibt, welche Shell Sie verwenden möchten:

#!/bin/bash

Wenn Sie als UTF-8 speichern, ist keine Stückliste (z. B. in BBEdit ) in Ordnung .


8
Das liegt daran, dass Microsoft die Bedeutung des Standards vertauscht hat. UTF-8 hat keine Stückliste: Sie haben Microsoft UTF-8 erstellt, das eine falsche Stückliste vor dem Datenstrom einfügt, und Ihnen dann mitgeteilt, dass dies tatsächlich UTF-8 ist. Es ist nicht. Es erweitert und korrumpiert nur.
Tchrist

4

Wie oben erwähnt, kann UTF-8 mit Stückliste Probleme mit nicht Stücklistenfähiger (oder kompatibler) Software verursachen. Ich habe einmal HTML-Dateien bearbeitet, die als UTF-8 + BOM mit dem Mozilla-basierten KompoZer codiert wurden , da ein Client WYSIWYG benötigte Programm benötigte.

Das Layout würde beim Speichern immer zerstört. Ich brauchte einige Zeit, um mich darum zu kümmern. Diese Dateien funktionierten dann in Firefox gut, zeigten jedoch im Internet Explorer eine CSS-Eigenart, die das Layout erneut zerstörte. Nachdem ich stundenlang erfolglos mit den verknüpften CSS-Dateien herumgespielt hatte, stellte ich fest, dass Internet Explorer die BOMfed-HTML-Datei nicht mochte. Nie wieder.

Außerdem habe ich das gerade in Wikipedia gefunden:

Die Shebang-Zeichen werden in erweiterten ASCII-Codierungen, einschließlich UTF-8, das üblicherweise für Skripte und andere Textdateien auf aktuellen Unix-ähnlichen Systemen verwendet wird, durch dieselben zwei Bytes dargestellt. UTF-8-Dateien können jedoch mit dem optionalen Byte Order Mark (BOM) beginnen. Wenn die Funktion "exec" die Bytes 0x23 0x21 spezifisch erkennt, verhindert das Vorhandensein der Stückliste (0xEF 0xBB 0xBF) vor dem Shebang, dass der Skriptinterpreter ausgeführt wird. Einige Behörden raten aus diesem Grund und aus Gründen der Interoperabilität und aus philosophischen Gründen davon ab, das Byte-Ordnungszeichen in POSIX-Skripten (Unix-like) zu verwenden [15]


4

Die häufig gestellten Fragen zu Unicode Byte Order Mark (BOM) bieten eine präzise Antwort:

F: Wie soll ich mit Stücklisten umgehen?

A: Hier sind einige Richtlinien, die befolgt werden müssen:

  1. Für ein bestimmtes Protokoll (z. B. Microsoft-Konventionen für TXT-Dateien) muss möglicherweise die Stückliste für bestimmte Unicode-Datenströme verwendet werden, z. B. für Dateien. Wenn Sie einem solchen Protokoll entsprechen müssen, verwenden Sie eine Stückliste.

  2. Einige Protokolle erlauben optionale Stücklisten für Text ohne Tags. In diesen Fällen

    • Wenn bekannt ist, dass ein Textdatenstrom einfacher Text ist, jedoch eine unbekannte Codierung aufweist, kann die Stückliste als Signatur verwendet werden. Wenn keine Stückliste vorhanden ist, kann die Codierung beliebig sein.

    • Wenn bekannt ist, dass ein Textdatenstrom einfacher Unicode-Text ist (aber nicht welcher Endian), kann die Stückliste als Signatur verwendet werden. Wenn keine Stückliste vorhanden ist, sollte der Text als Big-Endian interpretiert werden.

  3. Einige byteorientierte Protokolle erwarten ASCII-Zeichen am Anfang einer Datei. Wenn UTF-8 mit diesen Protokollen verwendet wird, sollte die Verwendung der Stückliste als Signatur für das Codierungsformular vermieden werden.

  4. Wenn der genaue Typ des Datenstroms bekannt ist (z. B. Unicode-Big-Endian oder Unicode-Little-Endian), sollte die Stückliste nicht verwendet werden. Insbesondere darf eine Stückliste nicht verwendet werden, wenn ein Datenstrom als UTF-16BE, UTF-16LE, UTF-32BE oder UTF-32LE deklariert wird.


1

Von http://en.wikipedia.org/wiki/Byte-order_mark :

Das Byte Order Mark (BOM) ist ein Unicode-Zeichen, mit dem die Endianness (Bytereihenfolge) einer Textdatei oder eines Streams signalisiert wird. Sein Codepunkt ist U + FEFF. Die Verwendung von Stücklisten ist optional und sollte, falls verwendet, am Anfang des Textstroms angezeigt werden. Über seine spezifische Verwendung als Indikator für die Bytereihenfolge hinaus kann das Stücklistenzeichen auch angeben, in welcher der verschiedenen Unicode-Darstellungen der Text codiert ist.

Wenn Sie immer eine Stückliste in Ihrer Datei verwenden, wird sichergestellt, dass diese in einem Editor, der UTF-8 und Stückliste unterstützt, immer korrekt geöffnet wird.

Mein eigentliches Problem mit dem Fehlen von Stücklisten ist das Folgende. Angenommen, wir haben eine Datei, die Folgendes enthält:

abc

Ohne Stückliste wird dies in den meisten Editoren als ANSI geöffnet. Ein anderer Benutzer dieser Datei öffnet sie und fügt einige native Zeichen hinzu, zum Beispiel:

abg-αβγ

Ups ... Jetzt ist die Datei immer noch in ANSI und raten Sie mal, "αβγ" belegt nicht 6 Bytes, sondern 3. Dies ist nicht UTF-8 und dies verursacht später in der Entwicklungskette andere Probleme.


9
Stellen Sie sicher, dass am Anfang einer nicht Stücklisten-fähigen Software falsche Bytes angezeigt werden. Yay.
Romain

1
@Romain Muller: zB wirft PHP 5 "unmögliche" Fehler aus, wenn Sie versuchen, Header nach der Stückliste zu senden.
Piskvor verließ das Gebäude

5
αβγ ist kein ASCII, kann aber in 8-Bit-Ascii-Bass-Codierungen auftreten. Die Verwendung einer Stückliste deaktiviert einen Vorteil von utf-8, dessen Kompatibilität mit ASCII (Fähigkeit, mit Lagacy-Anwendungen zu arbeiten, bei denen reines ASCII verwendet wird).
Strg-Alt-Delor

1
Das ist die falsche Antwort. Eine Zeichenfolge mit einer Stückliste davor ist etwas ganz anderes. Es soll nicht da sein und vermasselt einfach alles.
Tchrist

Ohne Stückliste wird dies in den meisten Editoren als ANSI geöffnet. Ich stimme absolut zu. In diesem Fall haben Sie Glück, wenn Sie sich mit der richtigen Codepage befassen, aber es ist in der Tat nur eine Vermutung, da die Codepage nicht Teil der Datei ist. Eine Stückliste ist.
hell

1

Hier ist meine Erfahrung mit Visual Studio, Sourcetree und Bitbucket-Pull-Anfragen, die mir einige Probleme hat:

Es stellt sich also heraus, dass Stücklisten mit einer Signatur bei der Überprüfung einer Pull-Anfrage ein rotes Punktzeichen in jeder Datei enthalten (dies kann ziemlich ärgerlich sein).

Geben Sie hier die Bildbeschreibung ein

Wenn Sie mit der Maus darüber fahren, wird ein Zeichen wie "ufeff" angezeigt, aber es stellt sich heraus, dass Sourcetree diese Arten von Bytemarks nicht anzeigt. Daher wird es höchstwahrscheinlich in Ihren Pull-Anforderungen enden, was in Ordnung sein sollte, da Visual Studio auf diese Weise in Ordnung ist 2017 codiert jetzt neue Dateien, daher sollte Bitbucket dies möglicherweise ignorieren oder auf andere Weise anzeigen lassen. Weitere Informationen finden Sie hier:

Red Dot Marker BitBucket Diff-Ansicht


-4

UTF mit einer Stückliste ist besser, wenn Sie UTF-8 in HTML-Dateien verwenden und wenn Sie serbisches Kyrillisch, serbisches Latein, Deutsch, Ungarisch oder eine exotische Sprache auf derselben Seite verwenden.

Das ist meine Meinung (30 Jahre Computer- und IT-Industrie).


1
Ich finde das auch wahr. Wenn Sie Zeichen außerhalb des ersten 255 ASCII-Satzes verwenden und die Stückliste weglassen, interpretieren Browser diese als ISO-8859-1 und Sie erhalten verstümmelte Zeichen. Angesichts der obigen Antworten liegt dies anscheinend daran, dass die Browser-Anbieter das Falsche tun, wenn sie keine Stückliste erkennen. Wenn Sie jedoch nicht bei Microsoft Edge / Mozilla / Webkit / Blink arbeiten, haben Sie keine andere Wahl, als mit den Fehlern dieser Apps zu arbeiten.
Asontu

UTF was? UTF-8? UTF-16? Etwas anderes?
Peter Mortensen
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.