Was ist anders zwischen UTF-8 und UTF-8 ohne Stückliste ? Welches ist besser?
Was ist anders zwischen UTF-8 und UTF-8 ohne Stückliste ? Welches ist besser?
Antworten:
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 .
Die anderen ausgezeichneten Antworten haben bereits geantwortet:
EF BB BF
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:
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.
Es gibt mindestens drei Probleme beim Einfügen einer Stückliste in UTF-8-codierte Dateien.
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:
cat
Ihnen 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 cat
auf Byte-Ebene arbeitet, nicht auf der Ebene des interpretierten Inhalts, und auf ähnliche Weise beispielsweise cat
nicht 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.
Hier sind Beispiele für die Verwendung von Stücklisten, die tatsächlich echte Probleme verursachen, und dennoch wissen viele Menschen nichts davon.
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]
Siehe RFC 7159, Abschnitt 8.1 :
Implementierungen dürfen am Anfang eines JSON-Textes KEINE Byte-Ordnungsmarke hinzufügen.
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 ).
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:
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.
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.
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.
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 BF
am 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.
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.
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 )
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.
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 more
es 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 chcp
Befehl bietet Unterstützung für UTF-8 ( ohne Stückliste) über die Codepage 65001 .
.htaccess
und gzip compression
in Kombination mit UTF-8 Stückliste einen Codierungsfehler ergibt. Ändern Sie die Codierung in UTF-8 ohne Stückliste.
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.
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.
Es ist zu beachten, dass für einige Dateien die Stückliste auch unter Windows nicht vorhanden sein darf . Beispiele sind SQL*plus
oder VBScript
Dateien. Wenn solche Dateien eine Stückliste enthalten, wird beim Versuch, sie auszuführen, eine Fehlermeldung angezeigt.
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.
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."
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.
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 .
chcp 65001
fü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.a
oder echo אאא>a.a
chcp 65001 haben, wird sie ohne Stückliste ausgegeben.
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.
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 .
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]
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:
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.
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.
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.
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.
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.
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).
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:
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).