Проблеми с визуализацията на UTF-8 BOM

Когато използвам UTF-8 кодирани страници във някои уеб браузъри се появява допълнителен нов ред или нежелани символи в нчалото на страницата или вмъкнатият файл. Как да ги премахна?

Отговор

Ако работите с файл който е кодиран с UTF-8, проблемите ви с визуализацията може да са причинени от наличието на UTF-8 маркировка (BOM) която уеб браузърът ви не разпознава. 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.

BOM е винаги в началото на файла, следователно бихте очаквали проблемите с визуализацията да бъдат винаги в начлото на страницата. Въпреки това може да откриете празни редове които се появяват въре във страницата ако е вмъкнат текс от друг файл който започва със UTF-8 маркировка.

Тази статия ще ви помогне да определите дали UTF-8 е причината за проблема. Ако няма следи от UTF-8 маркировка в началото на файла, тогава би трябвало да потърсите решението на проблема другаде.

Какво е UTF-8 маркировка (BOM)?

Някои програми вмъкват определена комбинациа от байтове в началото на файла за да маркират че текстът който се съдържа вътре е Unicode. Тази комбинация от байтове е позната като signature (маркировка) или Byte Order Mark (BOM). Някои программи - като текстови редактори и уеб браузъри - ще визуализират BOM като допълнителен ред във файла, други ще визуализират странни символи като .

Вижте навигацията отстрани за повече информация относно BOM.

BOM е Unicode стартова точка за кодиране U+FEFF, съответстваща на Unicode символа 'ZERO WIDTH NON-BREAKING SPACE' (ZWNBSP).

В UTF-16 и UTF-32 кодирането, ако няма алтернативен индикатор, BOM е това което определя правилното интерпретиране на съдържанието на файла. Всеки символ във файла е представен от 2 или 4 байта и редът на тези байтове е от значение; BOM посочва този ред.

В UTF-8 кодирането, наличието на BOM не е от съществено значение, защото за разлика от UTF-16 или UTF-32 кодирането, няма алтернативна поредица от байтове за символа. Въпреки това BOM може да присъства в UTF-8 кодиран текс, в следствие на конвертиране на кодировката или защото е добавен от редактор.

Проверка за наличие на BOM

Първо трябва да проверим дали наистина съществува BOM в началото на файла.

Може да провеите за BOM във визуализираното съдържание, но ако вашият редактор интерпретира UTF-8 маркировката правилно най-вероятно няма да можете да го видите. Редактор който не интерпретира UTF-8 маркировката правилно показва байтовете които образуват тази маркировка използвайки собствените си настройки за кодиране на символите. (Със Latin 1 (ISO 8859-1) кодиране на символите, маркировката се визуализира по следният начин .) Прегледана със шестнадесетичен редактор UTF-8 маркировката изглежда по следният начин EF BB BF.

Възможно е вашият редактор да покаже индикация в меню или в лентата за статуса относно кодирането на файла, включително информация за наличието на UTF-8 маркировка.

Ако не, някакъв тест написан на скриптинг език (виж по-долу) би могъл да помогне. (Забележка. Ако е файл вмъкнат в PHP или някакъв дург механизъм който мислите че е причина за проблема, напишете адреса на вмъкнатият файл.)

Премахване на BOM

Ако използвате редактор който показва символоте които предсатвят UTF-8 маркировката сигурно би било възможно да ги изтриете ръчно. Но най-вероятно обаче BOM присъства именно зашото не се вижда при визуализацията.

Проверете дали вашият редактор разрешава да се специфицира дали UTF-8 кодриовка е добавена или запазаена по време на запис. Такъв редактор обаче би трябвало да да ви предоставя възможност да премахнете маркировката просто като заредите файла и го запишете обратно. Например ако Dreamweaver открие BOM диалога Запиши Като ще съдържа отметка "Включи Unicode кодировка (BOM)". Просто изключете опцията и запишете.

Едното от преимуществата когато използвате скрипт е че можете да премахнете маркировката бързо от множество файлове едновременно. Всъщност скрипта може да бъде стартиран автоматично като част от вашият работен процес. Ако използвате Perl, може да използвате този простичък скрипт написан от Martin Dürst.

Забележка: Трябва да проверите как се отразява премахването на маркировката на процеса на генериране на съдържанието. Възможно е някоя част от процеса на генериране на съдържание да разчита на маркировката за да определи че файла е UTF-8 кодиран. Имайте в предвид че страници които в по-голямата си част съдържат Latin символи може привидно да изглежда правилни, но често символите извън ASCII диапазона (U+0000 to U+007F) може да бъдат кодирани грешно.

Междо другото

Ще откриете че някои текстови редактори като Windows Notepad добвят автоматично UTF-8 маркировка на всеки файл който зпишете като UTF-8.

UTF-8 маркировка в началото на CSS файл може да причини проблеми с някои уеб браузъри.

В някои браузъри, наличието на UTF-8 маркировка ше накара браузъра да интерпретира текста като UTF-8 без значение каква кодировка на символите е зададена в декларациите.