BOM: Что такое метка порядка байтов?

Информация, передаваемая через Интернет, должна быть расположена в определенном порядке. Получатель данных (например, HTML-страница) должен знать, как прочитать эту информацию. Для этого в коде проставляются различные маркеры. Одним из таких маркеров является метка порядка байтов (BOM). Но для чего предназначен этот маркер?

Зачем нужен BOM?

Символы могут быть закодированы различными способами. Хотя сегодня часто используется UTF-8, ранее была популярна кодировка UTF-16, которая часто используется и сегодня. Также иногда используется UTF-32. Однако, в отличие от UTF-8, кодирование с большим количеством битов на символ требует знания порядка следования байтов.

При кодировке UTF-8 каждый символ может быть представлен в одном байте (т.е. 8 бит). В кодировке UTF-16, с другой стороны, для кодирования одного символа требуется два байта (т.е. 16 бит). Для того чтобы символ был правильно интерпретирован, должно быть ясно, читаются ли байты слева направо или справа налево. В зависимости от этого создается совершенно другое значение.

  • Слева направо: 01101010 00110101 — это 6a35 в шестнадцатеричной системе счисления
  • Справа налево: 01101010 00110101 — это 356a в шестнадцатеричной системе счисления.

Если рассматривать эту последовательность чисел в контексте таблицы Unicode, то будут отображаться два совершенно разных символа. Первая форма интерпретации известна как Big Endian (BE), а вторая — как Little Endian (LE). Причина этого заключается в том, что в Big Endian сначала указывается большее значение, а в Little Endian — меньшее.

Факт

В повседневной жизни чаще используется нотация Big Endian. Но это всего лишь условность. Компьютеры могут работать с обоими методами хранения, поэтому имеет смысл их обозначить.

Для того чтобы указать порядок чтения байтов, нужен BOM. Это символ, который не виден и поэтому также известен как пробел нулевой ширины без разрыва. Это пробел, который имеет ширину, равную нулю, и не вызывает разрыва строки. В UTF-16 этот символ (шестнадцатеричный) имеет значение feff (BE) или fffe (LE). К этому значению добавляется префикс фактической кодировки символа.

В UTF-8 BOM фактически не нужен — и все же он встречается в текстах, закодированных с его помощью. Это либо остаток, возникший при преобразовании UTF-16/UTF-32 в UTF-8, либо он был автоматически вставлен редактором. Это связано с тем, что даже если метка порядка байтов не нужна для UTF-8, она обычно не мешает, поскольку не отображается.

Проблемы со знаком порядка байтов

Проблемы возникают, когда принимающая система не знает, как обрабатывать BOM. Некоторые версии PHP или различные Unix-подобные среды не ожидают этого символа, что может привести, например, к неправильному представлению веб-сайта.

Проблемы могут также возникнуть между HTTP и HTML: Один заголовок HTTP уже содержит информацию о кодировке символов. Это происходит из настроек сервера. Если HTML-документ был создан с помощью BOM, но HTTP-заголовок указывает браузеру другое, это также может привести к ошибкам отображения. Этого больше не должно происходить, поскольку в спецификации HTML5 произошли изменения: Там требовалось, чтобы BOM в начале перезаписывал информацию HTTP-заголовка. Однако возможно, что в старых версиях браузеров это новое правило еще не реализовано.

Как удалить BOM

Если вы хотите удалить метку порядка байтов из исходного кода, вам понадобится текстовый редактор, который предлагает возможность сохранения метки. Вы считываете файл с BOM в программу, затем снова сохраняете его без BOM и таким образом преобразуете кодировку. После этого отметка больше не должна появляться. В популярном текстовом редакторе Notepad++, например, вы можете изменить кодировку, а затем сохранить файл без BOM.

Примечание

В старых версиях Notepad++ вы все еще можете найти пункт меню UTF-8 без BOM. В более новых версиях это соответствует UTF-8. С маркером запись будет соответствовать UTF-8 BOM.

Оцените статью
cdelat.ru
Добавить комментарий