Byte -Bestellmarke
Das Byte -Bestellmarke (Bom) ist eine besondere Verwendung des Specials Unicode Charakter, U+feff Byte -Bestellmarke, dessen Auftritt als Aussehen magische Zahl Zu Beginn eines Textstreams kann ein mehrere Dinge an a signalisieren Programm Lesen des Textes:[1]
- Die Byte -Ordnung oder Endiangessdes Textstroms in den Fällen von 16-Bit- und 32-Bit-Codierungen;
- Die Tatsache, dass die Codierung des Textstroms auf ein hohes Maß an Vertrauen ist;
- Welche Unicode -Zeichenkodierung wird verwendet.
Die Verwendung von BOM ist optional. Seine Präsenz beeinträchtigt die Verwendung von UTF-8 Mit Software, die nicht zu Beginn einer Datei nicht erwartet, dass Nicht-ASCII-Bytes, der jedoch den Textstrom ansonsten verarbeiten könnte.
Unicode kann in Einheiten von 8-Bit-, 16-Bit- oder 32-Bit-Ganzzahlen codiert werden. Für die 16- und 32-Bit-Darstellungen muss ein Computer, der Text aus willkürlichen Quellen erhält Nichtcharakter Unicode -Codepunkt, wenn seine Bytes ausgetauscht werden. Daher kann der Prozess, der auf den Text zugreifen kann, diese ersten Bytes untersuchen, um die Endianess zu bestimmen, ohne einen Vertrag oder Metadaten außerhalb des Textstroms selbst zu erfordern. Im Allgemeinen tauscht der empfangende Computer die Bytes bei Bedarf gegen seine eigene Endianess aus und benötigt die BOM nicht mehr zur Verarbeitung.
Die Byte -Sequenz der BOM unterscheidet sich pro Unicode -Codierung (einschließlich derjenigen außerhalb des Unicode -Standards wie z. UTF-7, sehen Tabelle unten), und keine der Sequenzen erscheint wahrscheinlich zu Beginn von Textströmen, die in anderen Codierungen gespeichert sind. Durch das Platzieren einer codierten BOM zu Beginn eines Textstroms kann darauf hingewiesen werden, dass der Text Unicode ist und das verwendete Codierungsschema identifiziert. Diese Verwendung des BOM -Zeichens wird als "Unicode -Signatur" bezeichnet.[2]
Verwendungszweck
Wenn das BOM -Zeichen in der Mitte eines Datenstroms erscheint, sagt Unicode, dass es als "als" interpretiert werden sollte "Null-Breiten-nicht-bahnbrechender Raum"(hemmt das Zeilenaufbruch zwischen Wortglyphen). In Unicode 3.2 wird diese Verwendung zugunsten des" veraltet "Wort Joiner"Charakter, U+2060.[1] Auf diese Weise kann U+Feff nur als BOM verwendet werden.
UTF-8
Das UTF-8 Darstellung der BOM ist die (hexadezimal) Byte -Sequenz 0xef, 0xBB, 0xBF
.
Der Unicode -Standard ermöglicht die BOM in UTF-8,[3] benötigt aber nicht die Verwendung oder empfiehlt es nicht.[4] Byte-Ordnung hat in UTF-8 keine Bedeutung,[5] Die einzige Verwendung in UTF-8 besteht also darin, am Start zu signalisieren, dass der Textstrom in UTF-8 codiert ist oder dass er von einem Stream mit einer optionalen BOM in UTF-8 konvertiert wurde. Der Standard empfiehlt auch nicht, eine BOM zu entfernen, wenn sie dort ist, sodass die Roundtrips zwischen Codings keine Informationen verliert und dass der Code, der darauf stützt, weiterhin funktioniert.[6][7] Das IETF empfiehlt, dass, wenn ein Protokoll entweder (a) immer UTF-8 verwendet oder (b) einen anderen Weg hat, um anzugeben, was Codierung verwendet wird, "die Verwendung von U+Feff als Signatur verbieten".[8] Ein Beispiel dafür, diese Empfehlung nicht zu befolgen, ist das IETF Syslog Protokoll, für das Text in UTF-8 und auch die BOM erforderlich ist.[9]
Wenn Sie eine BOM nicht verwenden, können Text mit einer Software, die nicht unikdebewusst ist, rückwärtskompatibel ist. Beispiele sind Programmiersprachen, die nicht zulassenASCII Bytes in String -Literale aber nicht zu Beginn der Datei.
UTF-8 ist eine spärliche Codierung in dem Sinne, dass ein großer Teil möglicher Byte-Kombinationen nicht zu einem gültigen UTF-8-Text führt. Binärdaten und Text in jeder anderen Codierung enthalten wahrscheinlich Byte-Sequenzen, die als UTF-8 ungültig sind. Praktisch die einzigen Ausnahmen davon sind, wenn der Text nur aus Bytes von ASCII-Reichweite besteht. Da alle modernen Codierungen ASCII-Range-Bytes verwenden, um ASCII-Zeichen darzustellen, kann Ascii-Only-Text sicher als UTF-8 interpretiert werden, unabhängig davon, was Codierung von dem System beabsichtigt war, das die Bytes emittiert. Aufgrund dieser Überlegungen kann die heuristische Analyse mit hohem Vertrauen feststellen, ob UTF-8 verwendet wird, ohne eine BOM zu erfordern.
Microsoft Compiler[10] und Dolmetscher und viele Softwareteile auf Microsoft Windows wie zum Beispiel Notizblock Behandle die BOM als erforderlich magische Zahl anstatt Heuristiken zu verwenden. Diese Tools fügen eine BOM hinzu, wenn Sie Text als UTF-8 speichern, und können UTF-8 nicht interpretieren, es sei denn, die BOM ist vorhanden oder die Datei enthält nur ASCII. Windows PowerShell (Bis zu 5.1) fügt eine BOM hinzu, wenn sie UTF-8 XML-Dokumente speichert. PowerShell Core 6 hat jedoch a hinzugefügt -Codierung
Schalten Sie einige CMDlets ein, die als UTF8NOBOM bezeichnet werden, damit das Dokument ohne BOM gespeichert werden kann. Google Dokumente Fügt auch eine BOM hinzu, wenn Sie ein Dokument in a konvertieren einfacher Text Datei zum Download.
UTF-16
Im UTF-16, eine bom (U+feff
) kann als erster Zeichen einer Datei oder eines Zeichenstroms platziert werden, um die Endianges (Byte-Reihenfolge) aller 16-Bit anzuzeigen Codeeinheit der Datei oder Stream. Wenn ein Versuch unternommen wird, diesen Stream mit der falschen Endiantheit zu lesen, werden die Bytes ausgetauscht, wodurch der Charakter geliefert wird U+fffe
, die ist definiert von Unicode als "Nichtcharakter"Das sollte niemals im Text erscheinen.
- Wenn die 16-Bit-Einheiten in vertreten sind in Big-Endian Bytereihenfolge wird die BOM in der Reihenfolge von Bytes als erscheinen
0xfe
0xff
- Wenn die 16-Bit-Einheiten verwenden Little-Endian Reihenfolge wird die BOM in der Reihenfolge von Bytes als angezeigt
0xff
0xfe
Keines dieser Sequenzen ist gültig UTF-8, daher zeigt ihre Anwesenheit an, dass die Datei nicht in UTF-8 codiert ist.
Für die Iana Registrierte Charsets UTF-16BE und UTF-16LE, eine Byte-Bestellmarke sollte nicht verwendet werden, da die Namen dieser Zeichensätze die Byte-Reihenfolge bereits bestimmen. Wenn Sie irgendwo in einem solchen Textstrom angetroffen werden, ist U+Feff als "Null-Breiten-No-Break-Raum" zu interpretieren.
Wenn es keine BOM gibt, ist es möglich zu erraten, ob der Text UTF-16 und seine Byte-Reihenfolge durch die Suche nach ASCII Lf). Eine große Anzahl (d. H. Eine weit höhere als zufällige Chance) in derselben Reihenfolge ist ein sehr guter Hinweis auf UTF-16 und ob sich die 0 in den geraden oder ungeraden Bytes befindet, zeigt die Byte-Reihenfolge an. Dies kann jedoch dazu führen beide Falsche positive und falsche Negative.
Klausel D98 der Konformität (Abschnitt 3.10) der Unicode-Standardzustände. Byte Order des UTF-16-Codierungsschemas ist Big-Endian. " Ob ein höheres Protokoll in Kraft ist oder nicht, ist offen für die Interpretation. Dateien lokal zu einem Computer, für den die native Byte-Bestellung beispielsweise nur wenig Endian ist, kann als UTF-16LE implizit codiert werden. Daher wird die Vermutung von Big-Endian weithin ignoriert. Das W3c/Waswg In HTML5 verwendeter Codierungsstandard gibt an, dass Inhalte, die entweder als "UTF-16" oder "UTF-16LE" bezeichnet werden, als Little-Endian interpretiert werden sollen, um mit bereitgestellten Inhalten umzugehen ".[11] Wenn jedoch eine Byte-Ordnung-Marke vorhanden ist, soll diese BOM als "maßgeblicher als alles andere" behandelt werden.[12]
Programme, die UTF-16 als Byte-basierte Codierung interpretieren . Das obere Byte von 0 kann als Nichts, Weißraum, eine Periode oder eine andere, unveränderliche Glyphe angezeigt werden.
UTF-32
Obwohl eine BOM mit verwendet werden könnte mit UTF-32Diese Codierung wird selten für die Übertragung verwendet. Ansonsten die gleichen Regeln wie für UTF-16 sind anwendbar.
Die BOM für Little-Endian UTF-32 ist das gleiche Muster wie eine Little-Endian-UTF-16-BOM, gefolgt von einem NUL-Charakter, ein ungewöhnliches Beispiel dafür, dass die BOM das gleiche Muster in zwei verschiedenen Kodierungen ist. Programmierer, die die BOM verwenden, um die Codierung zu identifizieren, müssen entscheiden, ob UTF-32 oder ein NUL-erstes Zeichen wahrscheinlicher ist.
Byte -Bestellmarken durch Codierung
Diese Tabelle zeigt, wie das BOM -Zeichen als Byte -Sequenz in verschiedenen Codierungen dargestellt wird und wie diese Sequenzen in einem Texteditor erscheinen könnten, der jedes Byte als Vermächtnis -Codierung interpretiert (CP1252 und Pflege Notation für die C0 -Steuerelemente):
Codierung | Darstellung (hexadezimal)) | Darstellung (Dezimal)) | Bytes als CP1252 -Zeichen |
---|---|---|---|
UTF-8[a] | Ef bb bf | 239 187 191 | ich" |
UTF-16 (SEIN)) | Fe ff | 254 255 | deine |
UTF-16 (Le)) | Ff fe | 255 254 | ŸÞ |
UTF-32 (SEIN) | 00 00 fe ff | 0 0 254 255 | ^@^@Þ Ruen ( ^@ ist der Nullcharakter)) |
UTF-32 (Le) | Ff Fe 00 00 | 255 254 0 0 | ŸÞ^@^@ ( ^@ ist der Nullcharakter) |
UTF-7[a] | 2b 2f 76[b][14][15] | 43 47 118 | +/v |
UTF-1[a] | F7 64 4c | 247 100 76 | ÷ dl |
UTF-EBCDIC[a] | DD 73 66 73 | 221 115 102 115 | Ýsfs |
Scsu[a] | 0e Fe ff[c] | 14 254 255 | ^NÞ lang ( ^N ist der "Verschiebungsschieber" -Scharakter)) |
Bocu-1[a] | FB EE 28 | 251 238 40 | ûî ( |
GB-18030[a] | 84 31 95 33 | 132 49 149 51 | „1 • 3 |
- ^ a b c d e f g Dies ist buchstäblich keine "Byte Order" -Marke, da eine Codeeinheit in diesen Codierungen ein Byte ist und daher keine Bytes in einer "falschen" Reihenfolge haben kann. Trotzdem kann die BOM verwendet werden, um die Codierung des folgenden Textes anzuzeigen.[5][13]
- ^ gefolgt von
38
,39
,2B
, oder2F
(ASCII8
,9
,+
oder/
), je nachdem, was der nächste Charakter ist. - ^ SCSU ermöglicht andere Kodierungen von U+Feff, das angezeigte Formular ist die in UTR #6 empfohlene Signatur.[16]
Siehe auch
- Marke von links nach rechts
- Arabische Präsentationsformen-b, Block welcher Codepunkt
U+feff
gehört
Verweise
- ^ a b "FAQ-UTF-8, UTF-16, UTF-32 & BOM". Unicode.org. Abgerufen 28. Januar 2017.
- ^ "Die Unicode® Standard Version 9.0" (PDF). Das Unicode -Konsortium.
- ^ "Der Unicode Standard 5.0, Kapitel 2: Allgemeine Struktur" (PDF). p. 36. Abgerufen 29. März 2009.
Tabelle 2-4. Die sieben Unicode -Codierungsschemata
- ^ "Der Unicode Standard 5.0, Kapitel 2: Allgemeine Struktur" (PDF). p. 36. Abgerufen 30. November 2008.
Die Verwendung einer BOM ist weder für UTF-8 erforderlich noch empfohlen, kann jedoch in Kontexten auftreten, in denen UTF-8-Daten aus anderen Codierungsformen konvertiert werden, die eine BOM verwenden oder bei denen die BOM als UTF-8-Signatur verwendet wird
- ^ a b "FAQ-UTF-8, UTF-16, UTF-32 & BOM: Kann ein UTF-8-Datenstrom das BOM-Zeichen enthalten (in UTF-8-Form)? Wenn ja, kann ich dann immer noch die verbleibenden UTF-8-Bytes annehmen sind in Big-Endian-Reihenfolge? ". Unicode.org. Abgerufen 4. Januar 2009.
- ^ "Re: Pre-HTML5 und die Bom von Asmus Freytag am 2012-07-13 (Unicode Mail-List-Archiv)". Unicode.org. Abgerufen 14. Juli 2012.
- ^ "Fehler-ID: JDK-6378911 UTF-8 Decoder-Handhabung der Byte-Order-Marke hat sich geändert". Bugs.java.com. Abgerufen 14. Oktober 2021.
- ^ Yerdeau, Francois (November 2003). UTF-8, ein Transformationsformat von ISO 10646. Ietf. doi:10.17487/rfc3629. RFC 3629. Abgerufen 15. Mai 2014.
- ^ Gerhards, Rainer (März 2009). "NACHRICHT". Das Syslog -Protokoll. Ietf. Sek. 6.4. doi:10.17487/rfc5424. RFC 5424.
- ^ Alf P. Steinbach (2011). "Unicode Teil 1: Windows -Konsolen -I/A -Ansätze". Abgerufen 24. März 2012.
Da der C ++-Quellcode jedoch ohne BOM als UTF-8 codiert wurde (wie unter Linux üblich), ging der visuelle C ++-Compiler fälschlicherweise an, dass der Quellcode als Windows ANSI codiert wurde.
- ^ "UTF-16LE". Codierungsstandard. Waswg.
- ^ "Dekodieren". Codierungsstandard. Waswg.
- ^ Yerdeau, François (8. November 2003). "RFC 3629 - UTF -8, Ein Transformationsformat von ISO 10646". Tools.ietf.org. Abgerufen 28. Januar 2017.
- ^ https://unicode.org/l2/l2021/21038-bom-guidance.pdf[Bare URL PDF]
- ^ "SDL -Dokumentation".
- ^ Markus Scherer. "UTS #6: Kompressionsschema für Unicode". Unicode.org. Abgerufen 28. Januar 2017.