it-swarm.com.de

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

Was ist anders zwischen UTF-8 und UTF-8 ohne BOM ? Welches ist besser?

757
simple

Die UTF-8-Stückliste ist eine Folge von Bytes am Anfang eines Textstroms (EF BB BF), mit der der Leser eine Datei zuverlässiger als in UTF-8 codiert erraten kann.

Normalerweise wird die Stückliste verwendet, um das Ende einer Codierung anzuzeigen, aber da das Ende für UTF-8 nicht relevant ist, ist die Stückliste nicht erforderlich.

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

2.6 Kodierungsschemata

... Die Verwendung einer Stückliste ist für UTF-8 weder erforderlich noch empfohlen, 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 .

712
Martin Cote

Die anderen ausgezeichneten Antworten haben bereits geantwortet:

  • Es gibt keinen offiziellen Unterschied zwischen UTF-8 und BOM-ed UTF-8
  • Eine BOM-ed UTF-8-Zeichenfolge 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 es könnte eine legitime Zeichenfolge in einer anderen Codierung sein.

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

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

Während es also 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 sein, nicht erraten.

217
paercebal

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 -Untergruppe von UTF-8 befindet, sind nicht mehr selbst ASCII, da die Stückliste keine ASCII-Datei ist, was dazu führt, dass einige vorhandene Tools nicht mehr funktionieren Es ist für Benutzer unmöglich, solche älteren Tools zu ersetzen.
  3. Es ist nicht möglich, mehrere Dateien miteinander zu verknüpfen, da jede Datei jetzt am Anfang eine Stückliste enthält.

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

  • Dies ist nicht ausreichend, da eine beliebige Bytefolge mit der genauen Reihenfolge beginnen kann, aus der sich die Stückliste zusammensetzt.
  • Dies ist nicht erforderlich, da Sie die Bytes so lesen können, als ob sie UTF-8 wären. Gelingt dies, ist dies per definitionem ein gültiges UTF-8.
120
J P

Es ist eine alte Frage mit vielen guten Antworten, aber eine Sache sollte hinzugefügt werden.

Alle Antworten sind sehr allgemein. Was ich hinzufügen möchte, sind Beispiele für die Verwendung von Stücklisten, die tatsächlich zu echten Problemen führen, und doch wissen viele Leute nichts darüber.

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 einem Shebang Zeile die wie eine der folgenden aussieht:

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

Sie teilt dem System mit, welcher Interpreter beim Aufrufen eines solchen Skripts ausgeführt werden muss. Wenn das Skript in UTF-8 codiert ist, ist man möglicherweise versucht, am Anfang eine Stückliste einzufügen. Aber eigentlich das "#!" Zeichen sind nicht nur Zeichen. Sie sind in der Tat eine magische Zahl , die sich zufällig aus zwei ASCII Zeichen zusammensetzt. Wenn Sie diesen Zeichen etwas (z. B. eine Stückliste) voranstellen, sieht die Datei so aus, als hätte sie eine andere magische Nummer, was zu Problemen führen kann.

Siehe Wikipedia, Artikel: Shebang, Abschnitt: Magic Number :

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

Stücklisten sind in JSON nicht zulässig

Siehe RFC 7159, Abschnitt 8.1 :

Implementierungen DÜRFEN KEINE Bytereihenfolge am Anfang eines JSON-Textes einfügen.

Stückliste ist in JSON redundant

Es ist nicht nur illegal in JSON, es wird auch nicht benötigt Ermitteln der Zeichenkodierung, da es zuverlässigere Möglichkeiten gibt, die in einem JSON-Stream verwendete Zeichenkodierung und Endianness eindeutig zu bestimmen (siehe diese Antwort für Details).

Stückliste bricht JSON-Parser

Es ist nicht nur illegal in JSON und nicht erforderlich , sondern tatsächlich bricht alle Software , die die Codierung mit der in RFC 4627 vorgestellten Methode ermittelt:

Bestimmen der Codierung und Endianness von JSON, Untersuchen der ersten 4 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 nun mit BOM 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 keine 3 NULs, sodass es nicht erkannt wird
  3. UTF-16BE hat nur 1 NUL in den ersten 4 Bytes, so dass es nicht erkannt wird
  4. UTF-16LE hat nur 1 NUL in den ersten 4 Bytes, so dass es nicht erkannt wird

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

Wenn die Implementierung auf gültiges JSON prüft, 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 der sollte RFC.

Andere Datenformate

Stücklisten in JSON werden nicht benötigt, sind illegal und beschädigen 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 steht es jedem frei, Dinge wie Stücklisten oder irgendetwas anderes zu 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 kleiner als 128 sein muss, verfügen Sie bereits über alle erforderlichen Informationen, um sowohl die Codierung als auch die Endianität Ihrer Daten zu bestimmen. Das Hinzufügen von Stücklisten selbst als optionale Funktion würde dies nur komplizierter und fehleranfälliger machen.

Andere Verwendungen von Stücklisten

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

69
rsp

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

Kurze Antwort: In UTF-8 wird eine Stückliste als die Bytes EF BB BF am Anfang der Datei codiert.

Lange Antwort:

Ursprünglich wurde erwartet, dass nicode in UTF-16/UCS-2 codiert wird. Die Stückliste wurde für dieses Codierungsformular entwickelt. Wenn Sie 2-Byte-Code-Einheiten haben, müssen Sie angeben, in welcher Reihenfolge sich diese beiden Bytes befinden. Eine übliche Konvention hierfür ist, das Zeichen U + FEFF als "Byte Order Mark" am Anfang der Daten einzufügen. Das Zeichen U + FFFE ist permanent nicht zugeordnet, sodass durch sein Vorhandensein die falsche Bytereihenfolge erkannt werden kann.

UTF-8 hat die gleiche Bytereihenfolge, unabhängig von der Endianzahl der Plattform. Eine Markierung für die Bytereihenfolge ist daher nicht erforderlich. Es kann jedoch (als die Byte-Sequenz EF BB FF) in Daten auftreten, die von UTF-16 in UTF-8 konvertiert wurden, oder als "Signatur", um anzuzeigen, dass es sich bei den Daten um UTF-8 handelt.

Welches ist besser?

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

Eine bessere Methode, um festzustellen, ob eine Datei UTF-8 ist, besteht darin, eine Gültigkeitsprüfung durchzuführen. In UTF-8 gelten strenge Regeln für die Gültigkeit von Byte-Sequenzen, sodass die Wahrscheinlichkeit eines falsch positiven Ergebnisses vernachlässigbar ist. Wenn eine Byte-Sequenz wie UTF-8 aussieht, ist dies wahrscheinlich der Fall.

48
dan04

UTF-8 mit Stückliste wird besser identifiziert. 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, glaubt Excel, dass es sich um ANSI handelt, und zeigt Kauderwelsch an. Wenn Sie "EF BB BF" an der Vorderseite hinzufügen (z. B. durch erneutes Speichern mit Notepad mit UTF-8 oder Notepad ++ mit UTF-8 mit BOM), wird es von Excel problemlos geöffnet.

Das Voranstellen des Stücklistenzeichens vor 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 )

29
Helen Craigman

Stückliste neigt dazu, irgendwo zu boomen (kein Wortspiel beabsichtigt). Und wenn es boomt (z. B. von Browsern, Editoren usw. nicht erkannt wird), wird es als seltsame Zeichen  am Anfang des Dokuments angezeigt (z. B. HTML-Datei, JSON Antwort, RSS usw.) und verursacht die Art von Verlegenheiten wie kürzlich aufgetretenes Codierungsproblem während des Gesprächs von Obama auf Twitter .

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

17
Halil Özgür

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

Hier sind einige Auszüge aus dem Wikipedia-Artikel zum 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 das BOM in UTF-8 , aber erfordert oder empfiehlt seine Verwendung nicht. Die Bytereihenfolge hat in UTF-8 keine Bedeutung. In UTF-8 wird sie nur verwendet, um zu Beginn zu signalisieren, dass der Textstrom in UTF-8 codiert ist.

Argument für NICHT mit einer Stückliste:

Die Hauptmotivation für das Nichtverwenden einer Stückliste ist die Abwärtskompatibilität mit Software, die nicht Unicode-fähig ist.

Argument FÜR mit einer Stückliste:

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

Programmierer gehen fälschlicherweise davon aus, dass die Erkennung von UTF-8 ebenso schwierig ist (dies liegt nicht daran, dass die meisten Byte-Sequenzen ungültig sind, während die Kodierungen, 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, z. B. Notepad, lesen UTF-8-Text nur dann korrekt, wenn nur _ vorhanden ist.ASCII Zeichen oder beginnt mit der Stückliste und fügt dem Start eine Stückliste hinzu, wenn Text als UTF-8 gespeichert wird. Google Text & Tabellen fügt eine Stückliste hinzu, wenn ein Microsoft Word-Dokument als reine Textdatei heruntergeladen wird.

Auf was ist besser, MIT oder OHNE die Stückliste:

Das IETF empfiehlt, dass, wenn ein Protokoll entweder (a) immer UTF-8 verwendet oder (b) auf andere Weise angibt, welche Codierung verwendet wird, es „die Verwendung von U verbieten SOLLTE + FEFF als Unterschrift. “

Meine Schlussfolgerung:

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

Beachten Sie auch, dass der Wikipedia-Artikel, auf den verwiesen wird, angibt, dass viele Microsoft-Anwendungen auf der Stückliste basieren, um UTF-8 korrekt zu erkennen. Dies gilt jedoch nicht für alle Microsoft-Anwendungen. Zum Beispiel, wie durch @ barlop hervorgehoben, wenn die Windows-Eingabeaufforderung mit UTF-8 verwendet wirdBefehle wie type und more erwarten nicht, dass die Stückliste vorhanden ist. Wenn die Stückliste vorhanden ist , kann dies wie bei anderen Anwendungen problematisch sein.


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

16
DavidRR

Es ist zu beachten, dass Sie für einige Dateien darf nicht die Stückliste auch unter Windows haben. Beispiele sind SQL*plus oder VBScript Dateien. Falls solche Dateien eine Stückliste enthalten, erhalten Sie eine Fehlermeldung, wenn Sie versuchen, sie auszuführen.

7

Zitiert am Ende der Wikipedia-Seite zu BOM: 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, 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."

7
pib

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

Bearbeiten: Ich möchte nur klarstellen, dass ich es vorziehe, die Stückliste überhaupt nicht zu haben, sie hinzuzufügen, wenn irgendein alter Müll damit bricht, und diese alte Anwendung zu ersetzen, ist nicht machbar.

Lassen Sie keine Stückliste für UTF8 erwarten.

7
James Wakefield

Diese Frage hat bereits eine Million Antworten und viele von ihnen 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) zum Bestimmen, 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 testen und einige Annahmen treffen. Hierbei wird geprüft, 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 zu treffen, ist eine zusätzliche Fehlerprüfung beim Lesen immer noch eine gute Idee, falls etwas verstümmelt auftaucht. Sie sollten nur davon ausgehen, dass eine Stückliste nicht UTF-8 (d. H. Latin-1 oder ANSI) ist, wenn die Eingabe sollte es definitiv nicht sein UTF-8 basierend auf ihrer Quelle. Wenn jedoch keine Stückliste vorhanden ist, können Sie einfach feststellen, ob es sich um UTF-8 handelt, indem Sie die Codierung überprüfen.

Warum wird eine Stückliste nicht empfohlen?

  1. Nicht Unicode-fähige oder schlecht kompatible Software geht möglicherweise von Latin-1 oder ANSI aus und entfernt die Stückliste nicht aus der Zeichenfolge, was offensichtlich Probleme verursachen kann.
  2. Es wird nicht wirklich benötigt (überprüfen Sie einfach, ob die Inhalte kompatibel sind und verwenden Sie immer UTF-8 als Fallback, wenn keine kompatible Codierung gefunden werden kann).

Wann sollte kodieren Sie mit einer Stückliste?

Wenn Sie die Metadaten nicht auf andere Weise (über ein Zeichensatz-Tag oder ein Dateisystem-Meta) aufzeichnen können und die Programme wie Stücklisten verwendet werden, sollten Sie sie mit einer Stückliste codieren. Dies gilt insbesondere für Windows, bei dem angenommen wird, dass für alle Elemente 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 darum geht, 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 sein, damit es reibungslos geöffnet werden kann und keine Daten importiert werden müssen.

7
jpc-ae

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, entweder unter Windows oder Linux.

Zum Beispiel ist eine Textdatei unter Windows oder Linux nicht (normalerweise) UTF-8, was am einfachsten vorstellbar ist.

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), auch wenn es als UTF-8 deklariert ist.

Ich hatte eine Reihe von Daten mit französischen Buchstaben, die für die Syndikation als XML gespeichert werden mussten. Ohne von Anfang an eine UTF-8-Datei zu erstellen (Ändern der Optionen in IDE und "Neue Datei erstellen") oder Hinzufügen der Stückliste am Anfang der Datei

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

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

6
Florin Sima

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

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

Darüber hinaus kann die Stückliste für Verbraucher, die sie nicht kennen oder nicht kennen, zu unnötigen Geräuschen und Schmerzen führen und zu Verwirrung bei den Benutzern führen.

6
Romain

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 auf Probleme stoße.

Ich verwende mehrere Sprachen (sogar Kyrillisch ) für eine lange Zeit auf meinen Seiten und wenn die Dateien ohne Stückliste gespeichert sind und ich sie erneut zum Bearbeiten mit einem Editor öffne (als cherouvim =========================================================================&.

Beachten Sie, dass Windows 'klassisches Editor automatisch Dateien 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 .

6
user1358065

Ein praktischer Unterschied besteht darin, dass Sie die folgende Antwort erhalten, wenn Sie ein Shell-Skript für Mac OS X schreiben und 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 (sagen wir in BBEdit ) in Ordnung.

6
David

Die FAQ zu Unicode Byte Order Mark (BOM) liefert eine präzise Antwort:

F: Wie soll ich mit Stücklisten umgehen?

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

  1. Ein bestimmtes Protokoll (z. B. Microsoft-Konventionen für TXT-Dateien) erfordert möglicherweise die Verwendung der Stückliste für bestimmte Unicode-Datenströme, z. B. Dateien. Wenn Sie ein solches Protokoll einhalten müssen, verwenden Sie eine Stückliste.

  2. Bei einigen Protokollen sind optionale Stücklisten für nicht getaggten Text zulässig. In diesen Fällen

    • Wenn bekannt ist, dass ein Textdatenstrom reiner 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 reiner 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 wenn ein Datenstrom als UTF-16BE, UTF-16LE, UTF-32BE oder UTF-32LE deklariert ist, darf keine Stückliste verwendet werden.

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 dieses WYSIWYG Programm benötigte.

Das Layout würde beim Speichern immer zerstört. Es dauerte eine Weile, bis ich mich darum gekümmert hatte. Diese Dateien funktionierten dann in Firefox einwandfrei, zeigten jedoch im Internet Explorer eine CSS-Eigenart, die das Layout erneut zerstörte. Nachdem ich stundenlang vergeblich an den verlinkten CSS-Dateien herumgespielt hatte, stellte ich fest, dass Internet Explorer die BOMfed-HTML-Datei nicht mochte. Nie wieder.

Auch das habe ich gerade in Wikipedia gefunden:

Die Shebang-Zeichen werden in erweiterten ASCII -Codierungen durch dieselben zwei Bytes dargestellt, einschließlich UTF-8, das auf aktuellen Unix-ähnlichen Systemen häufig für Skripts und andere Textdateien verwendet wird. UTF-8-Dateien beginnen jedoch möglicherweise mit der optionalen Byte Order Mark (BOM). Wenn die Funktion "exec" speziell die Bytes 0x23 0x21 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 von der Verwendung der Bytereihenfolge in POSIX-Skripten (Unix-ähnlichen Skripten) ab [15]

4
Marek Möhling

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

Die Byte Order Mark (BOM) ist ein Unicode-Zeichen, mit dem die Endianzahl (Bytereihenfolge) einer Textdatei oder eines Streams angegeben wird. Sein Codepunkt ist U + FEFF. Die Verwendung der Stückliste ist optional und sollte, falls verwendet, am Anfang des Textstroms erscheinen. Abgesehen von seiner spezifischen Verwendung als Indikator für die Bytereihenfolge kann das Stücklistenzeichen auch angeben, in welcher der mehreren Unicode-Darstellungen der Text codiert ist.

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

Mein eigentliches Problem mit dem Fehlen von Stücklisten ist das Folgende. Angenommen, wir haben eine Datei mit folgendem Inhalt:

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 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.

1
cherouvim

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

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

enter image description here

Wenn Sie mit der Maus darüber fahren, wird ein Zeichen wie "ufeff" angezeigt, aber es hat sich herausgestellt, dass sourcetree diese Art von Bytemarks nicht anzeigt. Daher wird es höchstwahrscheinlich in Ihren Pull-Anfragen enden, was in Ordnung sein sollte, da VS 2017 so codiert neue dateien jetzt, vielleicht sollte bitbucket das ignorieren oder auf andere weise anzeigen, mehr info hier:

Red Dot Marker BitBucket Diff-Ansicht

0
Leo