Warum würde ich eine Unicode-Signatur-Byte-Order-Mark (BOM) verwenden?

7

Sind diese veraltet? Sie scheinen die schlechteste Idee aller Zeiten zu sein - betten Sie etwas in den Inhalt Ihrer Datei ein, das niemand sehen kann, aber die Funktionalität der Datei beeinträchtigt. Ich verstehe nicht, warum ich eins möchte.

    
Pup 25.06.2009, 19:06
quelle

8 Antworten

16

Sie sind in einigen Fällen notwendig, ja, weil es sowohl Little-Endian- als auch Big-Endian-Implementierungen von UTF-16 gibt.

Wie können Sie beim Lesen einer unbekannten UTF-16-Datei feststellen, welche der beiden verwendet wird? Die einzige Lösung besteht darin, einen leicht identifizierbaren Marker in die Datei einzufügen, der niemals mit etwas anderem verwechselt werden kann, unabhängig von der verwendeten Endian-Eigenschaft.

Das ist die Stückliste.

Und brauchst du einen? Nur wenn Sie 1) eine UTF-Kodierung verwenden, bei der Endianess ein Problem ist (es ist wichtig für UTF-16, aber UTF8 sieht immer gleich aus, unabhängig von endianess), und wird die Datei geteilt mit externen Anwendungen.

Wenn Ihre eigene App die einzige ist, die die Datei lesen und schreiben wird, können Sie die Stückliste weglassen und einfach ein für allemal entscheiden, welche Endianz Sie verwenden werden. Wenn jedoch eine andere Anwendung die Datei lesen muss, wird sie die Endianz nicht im Voraus kennen, daher kann es sinnvoll sein, die Stückliste hinzuzufügen.

    
jalf 25.06.2009, 19:13
quelle
9

Einige Auszüge aus den UTF- und BOM-FAQ des Unicode-Konsortiums können hilfreich sein.

  

F: Was ist eine Stückliste?

     

A: Eine Byte Order Mark (BOM) besteht aus dem Zeichencode U + FEFF am Anfang eines Datenstroms , wo er als Signatur verwendet werden kann Definieren der Byte-Reihenfolge und des Kodierungsformulars, hauptsächlich von unmarkierten Klartextdateien. Bei einigen Protokollen höherer Ebenen ist die Verwendung einer Stückliste in dem Unicode-Datenstrom, der in diesem Protokoll definiert ist, obligatorisch (oder verboten). (Hervorhebung von mir.)

Ich würde nicht genau sagen, dass die Byte-Order-Marke in die Daten eingebettet ist. Eher fügt die Daten voran. Das Zeichen ist nur eine Byte-Reihenfolge-Markierung, wenn es das erste Ding in dem Datenstrom ist. Überall sonst, und es ist das nullbreite nicht-brechende Leerzeichen . Unicode-fähige Programme, die die Byte-Reihenfolge-Markierung nicht berücksichtigen, werden durch ihre Anwesenheit sowieso nicht wirklich geschädigt, da das Zeichen unsichtbar ist, und ein Wort-Verbinder am Anfang eines Textblocks verbindet einfach das nächste Zeichen mit nichts, also hat es keine Wirkung.

  

F: Wo ist eine Stückliste sinnvoll?

     

A: Eine BOM ist am Anfang von Dateien nützlich, die als Text eingegeben werden, für die jedoch nicht bekannt ist, ob sie im Big oder Little Endian-Format vorliegen - sie kann auch als Hinweis darauf, dass die Datei in Unicode ist, im Gegensatz zu einer älteren Kodierung und darüber hinaus als Signatur für das verwendete spezifische Kodierungsformular.

Sie möchten also eine Stückliste, wenn Ihr Programm mehrere Unicode-Codierungen verarbeiten kann. Wie sonst wird Ihr Programm wissen, welche Codierung bei der Interpretation seiner Eingabe verwendet werden soll?

  

F: Wird eine Stückliste nur in 16-Bit-Unicode-Text verwendet?

     

A: Nein, eine Stückliste kann als Signatur verwendet werden, unabhängig davon, wie der Unicode-Text transformiert wird: UTF-16, UTF-8, UTF-7 usw. Die exakten Bytes der BOM ist was auch immer das Unicode-Zeichen U + FEFF in das Transformationsformat konvertiert. In diesem Formular dient die Stückliste dazu, sowohl anzugeben, dass es sich um eine Unicode-Datei handelt, als auch, um welches Format es sich handelt.

Das ist wahrscheinlich der Fall, wenn die Stückliste heute am häufigsten verwendet wird. Es unterscheidet UTF-8-kodierten Text von anderen Kodierungen; Es markiert nicht wirklich die Reihenfolge der Bytes, da UTF-8 nur eine Reihenfolge hat.

Wenn Sie Ihr eigenes Protokoll oder Datenformat entwerfen, müssen Sie keine Stückliste verwenden. Eine andere Frage aus den FAQ berührt das:

  

F: Wie markiere ich Daten, die U + FEFF nicht als Stückliste interpretieren?

     

A: Verwenden Sie das Tag UTF-16BE, um einen Big-Endian-UTF-16-Text anzuzeigen, und UTF-16LE, um einen Little-Endian-UTF-16-Text anzuzeigen. Wenn Sie eine Stückliste verwenden, markieren Sie den Text einfach als UTF-16.

Es erwähnt das Konzept des Tags für das Format Ihrer Daten. Das bedeutet, dass Sie das Format out-of-band aus den Daten selbst angeben müssen. Das ist toll, wenn Ihnen eine solche Einrichtung zur Verfügung steht, aber das ist oft nicht der Fall, besonders wenn ältere Systeme für Unicode nachgerüstet werden.

    
Rob Kennedy 25.06.2009 19:55
quelle
3

Die Stückliste gibt an, für welche Kodierung Unicode die Datei enthält. Ohne diese Unterscheidung würde ein Unicode-Leser nicht wissen, wie er die Datei lesen soll.

UTF-8 benötigt jedoch keine Stückliste.

Sehen Sie sich den Wikipedia-Artikel an.

    
Joseph 25.06.2009 19:13
quelle
2

Da Sie dies mit UTF-8 markiert haben, werde ich sagen, dass Sie keine Stückliste benötigen. Byto Order Marks sind nur für UTF-16 und UTF-32 nützlich, da sie den Computer darüber informieren, ob sich die Datei in Big Endian oder Little Endian . Einige Texteditoren können die Byte Order Mark verwenden, um zu entscheiden, welche Codierung das Dokument verwendet, aber dies ist nicht Teil des Unicode-Standards.

    
Andrew Marsh 25.06.2009 19:27
quelle
2

Die "BOM" ist ein Überbleibsel aus den frühen Tagen von Unicode, als angenommen wurde, dass die Verwendung von Unicode die Verwendung von 16-Bit-Zeichen bedeutet. Es ist völlig sinnlos in einer Codierung wie UTF-8, die nur eine Byte-Reihenfolge hat. Die Wahl von U + FEFF ist auch für UTF-32 suboptimal, da nicht zwischen allen möglichen Middle-Endian-Byte-Ordnungen unterschieden werden kann (dies würde eine Stückliste mit 4 verschiedenen Bytes erfordern).

Der einzige Grund, warum Sie einen verwenden, ist, wenn Sie UTF-16- oder UTF-32-Daten zwischen Plattformen mit unterschiedlichen Byte-Ordnungen senden, aber (1) die meisten Benutzer UTF-8 sowieso verwenden und (2) den MIME charset Parameter bietet einen besseren Mechanismus.

    
dan04 14.08.2010 22:32
quelle
0

UTF16 und UTF32 können sowohl in Big-Endian- als auch in Little-Endian-Form geschrieben werden. Sie könnten versuchen, die Endianität heuristisch zu bestimmen, indem Sie das Ergebnis der Behandlung der Datei in beiden Enden analysieren, aber um Ihnen alle Ärger zu ersparen, kann die BOM Ihnen das sofort sagen.

UTF-8 benötigt jedoch nicht wirklich eine Stückliste, da Sie Byte für Byte dekodieren.

    
Paul Dixon 25.06.2009 19:14
quelle
0

Unabhängig davon, ob Sie diese beim Erstellen von Textdateien selbst verwenden, ist es wahrscheinlich sinnvoll, darauf zu achten, wenn Sie Textdateien lesen. d.h. die Stückliste am Anfang der Datei erkennen und überspringen (und idealerweise entsprechend behandeln). Ich bin auf ein paar davon gestoßen, die es hatten und was anfangs einige Probleme verursachte, bis ich herausfand, was vor sich ging.

    
Nerdtron 08.11.2011 18:24
quelle
0

Da UTF16- und UTF32-BOMs angeben, ob der Inhalt im Big-Endian- oder Little-Endian-Format vorliegt und der Inhalt ebenfalls Unicode ist, klassifiziert die UTF-8-BOM die Datei als utf-8-codiert. Wie können Sie ohne die UTF-8-Stückliste wissen, ob es sich um eine ANSI-Datei oder UTF-8-codierte Datei handelt? Die UTF-8-Stückliste gibt natürlich keine Endianität an, da UTF-8 immer ein Byte-Stream ist, aber es gibt an, ob der Inhalt utf-8-codiert Unicode oder ANSI ist. Natürlich können Sie nach gültigen utf-8-Sequenzen suchen, aber meiner Meinung nach ist es einfacher, die ersten drei Bytes der Datei zu überprüfen.

    
brighty 03.03.2016 10:53
quelle