Sygnatura UTF-8 BOM a problemy z wyświetlaniem

Przy wykorzystaniu stron kodowanych w UTF-8, w niektórych agentach użytkownika na górze strony lub dołączonego pliku pojawia się dodatkowy pusty wiersz lub inne niechciane znaki. Jak się ich pozbyć?

Odpowiedź

Kiedy mamy do czynienia z plikami z kodowaniem znaków UTF-8 problemy z wyświetlaniem mogą być spowodowane obecnością sygnatury UTF-8 (BOM), której agent użytkownika nie rozpoznaje. This used to be a problem for static HTML files, but is no longer in recent versions of major browsers. However, if you use PHP to generate your HTML, this was still an issue with PHP version 5.3.6.

Sygnatura BOM pojawia się zawsze na początku pliku, więc problemy z wyświetlaniem pojawiają się najczęściej na górze strony. Jednak puste wiersze mogą pojawić się też w dalszej części strony, jeżeli dołączono do niej tekst z oddzielnego pliku, który rozpoczynał się sygnaturą UTF-8.

Ten artykuł ma za zadanie pomóc w określeniu czy to właśnie kodowanie UTF-8 jest przyczyną problemu. Jeżeli nic nie wskazuje na obecność sygnatury UTF-8 na początku pliku, rozwiązania problemu należy szukać gdzie indziej.

Czym jest sygnatura UTF-8 (BOM)?

Niektóre aplikacje umieszczają specjalną kombinację bajtów na początku pliku, wskazującą na to, że tekst zawarty w pliku jest kodowany w formacie Unicode. Ta kombinacja bajtów jest określana jako sygnatura lub Byte Order Mark (BOM). Niektóre aplikacje, takie jak edytory tekstu lub przeglądarki, wyświetlają sygnaturę BOM jako dodatkowy wiersz w pliku, inne z kolei mogą wyświetlić nieoczekiwane znaki, jak np. .

Szczegółowe informacje na temat sygnatury BOM można znaleźć na panelu bocznym.

W kodowaniu Unicode sygnatura BOM znajduje się w punkcie kodowym U+FEFF, odpowiadającym w Unicode znakowi 'ZERO WIDTH NON-BREAKING SPACE' (ZWNBSP).

W kodowaniu UTF-16 oraz UTF-32, o ile nie występuje jakiś alternatywny wskaźnik, sygnatura BOM jest niezbędna do zapewnienie poprawnej interpretacji zawartości pliku. Każdy znak w pliku jest reprezentowany przez 2 lub 4 bajty danych. Znaczenie ma też kolejność, w której bajty te są przechowywane w pliku. Sygnatura BOM wskazuje na tą właśnie kolejność.

W kodowaniu UTF-8 obecność sygnatury BOM nie jest konieczna, ponieważ w przeciwieństwie do kodowania UTF-16 i UTF-32 nie ma możliwości pojawienia się alternatywnej sekwencji bajtów w znaku. Syngatura BOM może jednak wciąż pojawić się w tekście z kodowaniem UTF-8 jako pozostałość po konwersji kodowaniu lub jeżeli zostanie dodana przez program do edycji pliku.

Wykrywanie sygnatury BOM

Na początku należy sprawdzić, czy sygnatura BOM rzeczywiście znajduje się na początku pliku.

Można poszukać sygnatury BOM w zawartości pliku, ale jeśli dany edytor poprawnie wykorzystuje sygnaturę UTF-8 najprawdopodobniej nie będzie można jej zobaczyć. Edytor, który nie wykorzystuje poprawnie sygnatury UTF-8 wyświetli składające się na sygnaturę bajty zgodnie z własnymi ustawieniami kodowania znaków. (Przy kodowaniu znaków Latin 1 (ISO 8859-1) sygnatura wyświetlana jest jako ciąg znaków .) W przypadku edytora binarnego umożliwiającego wyświetlanie szesnastkowych wartości bajtów w pliku sygnatura UTF-8 wyświetlana jest jako EF BB BF.

Możliwe też, że dany edytor wyświetli na pasku stanu lub w jednym z menu aktualne kodowanie pliku wraz z informacją o obecności lub nieobecności sygnatury UTF-8.

Jeżeli powyższe metody zawiodą lub okażą się niedostępne, można skorzystać z pomocy testu opartego na skrypcie (patrz niżej). (Uwaga, w przypadku plików dołączanych przez PHP lub inny mechanizm, który może być przyczyną problemu, należy wpisać adres URI dołączonego pliku.)

Usuwanie sygnatury BOM

Jeżeli dysponujemy edytorem wyświetlającym znaki składające się na sygnaturę UTF-8 można skasować je ręcznie. Jest jednak możliwe, że problem z sygnaturą BOM mamy dlatego, że jej nie widzimy.

Należy sprawdzić czy używany edytor zezwala na określenie czy sygnatura UTF-8 jest dodawana bądź zachowywana podczas zapisywania pliku. Edytor tego typu pozwala rozwiązać problem sygnatury poprzez odczytanie pliku i ponowne go zapisanie. Przykładowo, jeżeli Dreamweaver wykryje sygnaturę BOM w oknie dialogowym "zapisz jako" zaznaczone będzie opcja "Dołącz sygnaturę Unicode (BOM)". Wystarczy wtedy odznaczyć opcję i zapisać zmiany.

Jedną z zalet wykorzystania skryptów jest to, że możliwe jest szybkie usunięcie sygnatury z wielu plików. Tak naprawdę skrypt może być uruchamiany automatycznie jako część procesu. Jeżeli korzystamy z Perla możemy wykorzystać prosty skrypt napisany przez Martina Dürsta.

Uwaga: Należy sprawdzić wpływ usunięcia sygnatury na przebieg procesu. Jest możliwe, że jakaś cześć procesu budowy zawartości wykorzystuje sygnaturę do określenia pliku jako kodowanego w UTF-8. Trzeba również pamiętać, że strony o wysokiej zawartości znaków z alfabetu łacińskiego mogą na pierwszy rzut oka wyglądać poprawnie, ale w niektórych miejscach znaki spoza zakresu ASCII (U+0000 to U+007F) mogą być kodowane niepoprawnie.

Dodatkowe informacje

Niektóre edytory tekstu, takie jak Notatnik Windows, automatycznie dodają sygnaturę UTF-8 do każdego pliku, który zapisany zostanie z tym kodowaniem znaków.

Sygnatura UTF-8 na początku pliku CSS może w niektórych programach spowodować nieprawidłowe funkcjonowanie początkowych reguł z tego pliku.

W niektórych przeglądarkach obecność sygnatury UTF-8 może sprawić, że przeglądarka uzna tekst za kodowany w UTF-8 niezależnie od innych użytych deklaracji dotyczących kodowania.