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 BF 21b, větší než BMP UTF-8 1B 1 až 4 4B
FE FF 21b, větší než BMP UTF-16, varianta UTF-16BE, (big-endian) 2B 1 až 2 4B
FF FE 21b, větší než BMP UTF-16, varianta UTF-16LE, (little-endian) 2B 1 až 2 4B
00 00 FE FF 32b, větší než BMP UTF-32, varianta UTF-32BE, (big-endian) 2B 2 4B
FF FE 00 00 32b, větší než BMP UTF-32, varianta UTF-32LE, (little-endian) 2B 2 4B
EF BB BF 31b, větší než BMP UTF-8, rozšíření 1B 1 až 6 6B
FE FF 16b, právě BMP UCS-2, varianta UCS-2BE, (big-endian) 2B 1 2B
FF FE 16b, právě BMP UCS-2, varianta UCS-2LE, (little-endian) 2B 1 2B
- 8b, menší než BMP ASCII + code page 1B 1 1B
- 7b, menší než BMP ASCII 1B 1 1B