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 |