Frage

Sind diese veraltet? Sie scheinen wie die schlechteste Idee überhaupt - einbetten etwas in dem Inhalt der Datei, die niemand sehen kann, aber Auswirkungen der Funktionalität der Datei. Ich verstehe nicht, warum ich ein wünschen würde.

War es hilfreich?

Lösung

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

Wenn Sie einen unbekannten UTF-16-Datei zu lesen, wie kann man sagen, welche der beiden verwendet wird? Die einzige Lösung ist eine Art von leicht identifizierbaren Marker in der Datei zu platzieren, die nie für etwas anderes verwechselt werden, unabhängig von der Bytereihenfolge verwendet.

Das ist, was die Stückliste der Fall ist.

Und tun Sie ein benötigen? Nur wenn Sie 1) unter Verwendung einer UTF-Codierung sind, wo endianness ein Problem ist (es zählt für UTF-16, aber UTF8 sieht immer gleich, unabhängig von Endian), und die Datei geteilt werden soll mit externen Anwendungen.

Wenn Sie Ihre eigene App die einzige ist, die die Datei lesen und schreiben geht, können Sie die BOM, weglassen und einfach entscheiden, ein für alle Mal die endianness Sie verwenden werden. Aber wenn eine andere Anwendung die Datei lesen hat, wird es nicht die Endian im Voraus, so dass die Stückliste Hinzufügen könnte eine gute Idee sein.

Andere Tipps

Einige Auszüge aus dem UTF und BOM FAQ aus dem Unicode-Konsortium können hilfreich sein.

  

F: Was ist ein BOM

     

A A Bytereihenfolgemarkierung (BOM) besteht aus dem Zeichencode-U + FEFF zu Beginn eines Datenstroms , wobei es als eine Signatur verwendet werden kann, definieren der Bytereihenfolge und Form codiert, in erster Linie von unmarkierten Klartext Dateien. Unter einigen höheren Protokolle kann die Verwendung eines BOM sein in diesem Protokoll definiert obligatorisch (oder verboten) im Unicode-Datenstrom. (Hervorhebung von mir).

Ich würde nicht gerade sagen, dass die Byte-Reihenfolge-Marke ist eingebettet in den Daten. Vielmehr ist es Präfixe die Daten. Der Charakter ist nur ein Zeichen Byte-Reihenfolge, wenn es das erste, was in dem Datenstrom ist. Überall sonst, und es ist die Null-Breite non-breaking Raum . Unicode-fähigen Programme, die die Byte-Reihenfolge-Marke nicht ehren sind nicht wirklich durch seine Anwesenheit geschadet sowieso, da die Zeichen unsichtbar ist, und ein Wort-Schreiner am Anfang eines Textblocks verbindet nur das nächste Zeichen zu nichts, so hat es keine Wirkung.

  

F: Wo ist eine BOM nützlich

?      

A: Eine BOM ist am Anfang von Dateien nützlich, die als Text eingegeben werden, für die aber ist es nicht bekannt, ob sie in großen oder kleinen Endian sind format kann es auch als ein dienen Hinweis anzeigt, dass die Datei in Unicode ist, als die Codierung in einem Legacy gegenüber und es darüber hinaus wirkt als Signatur für die spezifische Kodierung Form verwendet.

So, dann würden Sie eine Stückliste wollen, wenn Ihr Programm des Umgangs mit mehreren Codierungen von Unicode fähig ist. Wie sonst wird Ihr Programm wissen, welche Codierung verwendet wird, wenn seine Eingabe zu interpretieren?

  

F: Wenn eine Stückliste verwendet wird, ist es nur in 16-Bit-Unicode-Text

     

A Nein, kann eine BOM als Signatur verwendet werden, ganz gleich, wie der Unicode Text umgewandelt wird: UTF-16, UTF-8, UTF-7 usw. Das genaue Bytes die umfasst BOM wird, was auch immer das Unicode-Zeichen U + sein FEFF in Format von dieser Transformation umgewandelt wird. In dieser Form dient die BOM, um anzuzeigen, beide, dass es eine Unicode-Datei ist, und welches der Formate ist es in.

Das ist wahrscheinlich der Fall, wenn die BOM heute am häufigsten verwendet werden. Es unterscheidet UTF-8-codierter Text aus einem beliebigen anderen Kodierungen; es ist wirklich nicht die Reihenfolge der Bytes Markierung da UTF-8 nur eine Ordnung hat.

Wenn Sie Ihr eigenes Protokoll oder Datenformat entwerfen, sind Sie nicht verpflichtet, eine Stückliste zu verwenden. Eine weitere Frage aus dem FAQ berührt, dass:

  

F: Wie TAGi Daten, die U + FEFF als BOM nicht interpretieren

     

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

Es erwähnt das Konzept von Tagging Ihre Daten des Format. Das bedeutet, dass das Format Out-of-Band-Angabe aus den Daten selbst. Das ist toll, wenn eine solche Einrichtung zur Verfügung steht, aber es ist oft nicht, vor allem, wenn ältere Systeme für Unicode nachgerüstet werden.

Die BOM bedeuten die Kodierung von Unicode die Datei in ist. Ohne diese Unterscheidung, ein Unicode-Leser würden nicht wissen, wie die Datei zu lesen.

Allerdings UTF-8 keine BOM erforderlich.

Überprüfen Sie die Wikipedia-Artikel .

Wie Sie diese mit UTF-8 getaggt Ich werde Sie nicht eine BOM sagen brauchen. Byto Order Marks sind nur nützlich für die UTF-16 und UTF-32, wie es den Computer, ob die Datei in Big Endian oder Little Endian . Einige Texteditoren die Byte Order Mark verwenden können, um zu entscheiden, was das Codieren das Dokument verwendet, aber dies ist nicht Teil des Unicode-Standard.

Die „BOM“ ist ein Überbleibsel aus den frühen Tagen des Unicode, wenn es wurde angenommen, dass die Verwendung von Unicode 16-Bit-Zeichen verwenden würde bedeuten. Es ist völlig sinnlos in einer Codiervorrichtung wie UTF-8, der nur ein Byte Ordnung hat. Die Wahl von U + FEFF ist auch suboptimal für UTF-32, weil es nicht zwischen allen möglichen mittleren Endian-Byte-Befehle unterscheiden kann (so tun würde mit 4 andere Bytes codiert eine Stückliste erforderlich ist).

Der einzige Grund, warum Sie eine solche verwenden würde, wenn UTF-16 oder UTF-32-Daten zwischen Plattformen mit unterschiedlichen Bytereihenfolgen senden, aber (1) die meisten Leute benutzen UTF-8 sowieso, und (2) die MIME charset Parameter liefern ein besserer Mechanismus.

UTF16 und UTF32 in beiden Big-Endian und Little-Endian Formen geschrieben werden. Sie könnten versuchen, heuristisch die Endianess zu bestimmen, indem das Ergebnis der Behandlung der Datei in beiden Endianess analysieren, aber sie alle zu speichern, die die BOM die Mühe kann man sofort sagen.

UTF-8 muss nicht wirklich eine BOM obwohl, wie Sie es Byte für Byte zu dekodieren.

Unabhängig davon, ob Sie diese selbst verwenden, wenn Textdateien erstellen, ist es wahrscheinlich lohnt sich bewusst sein, wenn Sie Textdateien lesen. d.h. erkennen und überspringen (und idealerweise entsprechend verarbeiten), um die BOM am Anfang der Datei. Ich habe in ein paar laufen, die sie hatten und verursacht meine einige Probleme am Anfang, bis ich herausgefunden, was los war.

Wie UTF16 und UTF32 Stücklisten sagen, ob der Inhalt in Big-Endian oder Little-Endian-Format und auch, dass der Inhalt ist Unicode, die UTF-8 BOM die Datei als UTF-8 klassifiziert codiert. Ohne die UTF-8 BOM, wie kann man wissen, ob es sich um eine ANSI-Datei oder UTF-8 kodierten Datei ist? Der UTF-8 BOM nicht Endianess natürlich sagen, weil utf-8 immer ein Byte-Strom ist, aber es sagt, wenn der Inhalt utf-8 kodierten Unicode oder ANSI ist. Natürlich können Sie für gültige utf-8-Sequenzen scannen, aber meiner Meinung nach, ist es einfacher, die ersten drei Bytes der Datei zu überprüfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top