Byte order mark

BOM (Byte order mark, česky přibližně „označení pořadí bajtů“) je znak hexadecimálně zapsaný jako FEFF (v desítkové soustavě 65279).

V kódování UTF-8 je tento znak reprezentován trojicí bajtů 0xEF 0xBB 0xBF („UTF-8 signatura“), v kódování UTF-16 big-endian dvojicí bajtů 0xFE 0xFF a v UTF-16 little-endian 0xFF 0xFE. Grafický význam znaku je „nedělitelná mezera nulové šířky“ (zero-width no-break space), je tak podobný znaku U+2060 (word joiner).[1]

Hlavním důvodem užití tohoto znaku je rozlišení pořadí ukládání bajtů big-endian nebo little-endian v UTF-16 a odlišení samotného UTF-16 od UTF-8. V případě záměny pořadí bajtů není znak U+FFFE platný Unicode znak, navíc v kódování UTF-8 se bajty 0xFE a 0xFF nesmí vyskytovat. Užití BOM v UTF-8 je pro účel rozpoznání pořadí ukládání bajtů nadbytečné, nicméně mnohé aplikace operačního systému Microsoft Windows používají tento znak na začátku souboru pro rozlišení souborů uložených ve formátu UTF-8. V některých systémech ( např. POSIX) není tato signatura používána.

Používání nebo nepoužívání BOM může být zdrojem problémů. Například Internet Explorer verze 6 u souborů HTML s BOM na začátku zobrazoval netisknutelné znaky před samotným obsahem HTML.

BOM
(hexa)
Velikost
prostoru Unicode
Kódovánívelikost
atomu
(B,1B=8b)
počet
atomů
maximální
délka znaku
(B,1B=8b)
EF BB BF21b, větší než BMPUTF-81B1 až 44B
FE FF21b, větší než BMPUTF-16, varianta UTF-16BE, (big-endian)2B1 až 24B
FF FE21b, větší než BMPUTF-16, varianta UTF-16LE, (little-endian)2B1 až 24B
00 00 FE FF32b, větší než BMPUTF-32, varianta UTF-32BE, (big-endian)2B24B
FF FE 00 0032b, větší než BMPUTF-32, varianta UTF-32LE, (little-endian)2B24B
EF BB BF31b, větší než BMPUTF-8, rozšíření1B1 až 66B
FE FF16b, právě BMPUCS-2, varianta UCS-2BE, (big-endian)2B12B
FF FE16b, právě BMPUCS-2, varianta UCS-2LE, (little-endian)2B12B
-8b, menší než BMPASCII + code page1B11B
-7b, menší než BMPASCII1B11B

Reference