BOM (informatyka)
BOM (ang. Byte Order Mark), znacznik kolejności bajtów[1] – znak niedrukowalny używany w wielobajtowym kodowaniu znaków, który jest zapisywany na początku strumienia bajtów (pliku) i informuje, w jakiej kolejności należy ustawić bajty, aby odczytać kod znaku. BOM rozwiązuje problem interpretacji kolejności bajtów w znaku i umożliwia automatyczną detekcję kodowania UTF-8, UTF-16LE, UTF-16BE, UTF-32LE oraz UTF-32BE.
Znaczniki BOM zależnie od kodowania
[edytuj | edytuj kod]Kodowanie | Kolejne bajty BOM | |
---|---|---|
szesnastkowo | w kodowaniu ISO 8859-1 | |
UTF-16LE | FF FE
|
ÿþ
|
UTF-16BE | FE FF
|
þÿ
|
UTF-32LE | FF FE 00 00 [i]
|
ÿþ␀␀ [ii]
|
UTF-32BE | 00 00 FE FF
|
␀␀þÿ [ii]
|
UTF-8[iii] | EF BB BF
|

|
Rozpoznawanie kodowania przez edytory
[edytuj | edytuj kod]W wypadku kodowania UTF-8 znacznik kolejności bajtów (BOM) nie jest niezbędny, ponieważ kolejność bajtów jest jednoznaczna. Jeśli jednak BOM dla pliku zakodowanego w UTF-8 jest dostępny, to kodowanie pliku (UTF-8) jest jednoznacznie określone i ułatwia edytorom tekstowym poprawną interpretację znaków.
Część edytorów próbuje wykryć kodowanie pliku, jeśli BOM nie jest dostępny (przez analizę dalszej zawartości pliku, czy analizę statystyczną), inne wyświetlą plik tak, jakby był zakodowany jednobajtowo. Natomiast starsze i mniej zaawansowane edytory mogą w ogóle nie reagować na znacznik BOM lub pokazać go jako znaki niedrukowalne na początku pliku.
Przykładowo Notatnik w niektórych wersjach systemu Windows stara się wykryć kodowanie wielobajtowe. Jednak przy zapisie takiego pliku dodaje znacznik wykrytego kodowania. To z kolei może powodować, że niektóre skrypty (np. PHP) zostaną nieprawidłowo zinterpretowane i przestaną działać poprawnie.
Lepiej pod tym względem zachowuje się przykładowo Programmer's Notepad, który wykrywa kodowanie, ale pozwala wybrać, czy dany plik zostanie zapisany ze znacznikiem BOM, czy nie.
Uwagi
[edytuj | edytuj kod]BOM powiększa rozmiar danych o kilka bajtów. Może nie być używany w systemach, gdzie z góry jest ustalony sposób kodowania (np. protokoły sieciowe zwykle stosują UTF-8 lub UTF-16BE) albo które mają oddzielne mechanizmy deklaracji kodowania (nagłówki MIME, nagłówki XML, znacznik meta w HTML).