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

KodowanieKolejne bajty BOM
szesnastkowow kodowaniu ISO 8859-1
UTF-16LEFF FEÿþ
UTF-16BEFE FFþÿ
UTF-32LEFF FE 00 00[i]ÿþ␀␀[ii]
UTF-32BE00 00 FE FF␀␀þÿ[ii]
UTF-8[iii]EF BB BF
  1. tak samo zaczyna się ciąg w kodowaniu UTF-16LE z BOM z pierwszym znakiem null
  2. a b – znak zastępczy dla null
  3. Kodowanie UTF-8 nie ma wariantów zależnych od kolejności bajtów.

Rozpoznawanie kodowania przez edytory

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

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).

Przypisy

Zobacz też