Маркер порядку байтів

символ Юнікоду

Ма́ркер поря́дку ба́йтів (англ. Byte-order mark, BOM) — символ Юнікоду з кодом U+FEFF («нерозривний пробіл нульової ширини»), що використовується для позначення порядку байтів в рядку символів Юнікода, що закодовано в UTF-16 або UTF-32. Ця позначка використовується для позначення того, що текст має кодування UTF-8, UTF-16 або UTF-32.

В більшості систем кодування, BOM рідко зустрічається в інших контекстах (зазвичай, вона виглядає як послідовність незрозумілих керуючих кодів). Якщо позначку BOM буде помилково інтерпретовано як дійсний символ Юнікода, її, взагалі кажучи, видно не буде, оскільки вона є нерозривним пробілом нульової ширини. Використання символу з кодом U+FEFF для інших цілей було скасовано в стандарті Юнікод 3.2 (в якому визначено символ U+2060 для застосування в інших цілях), що дозволило вивільнити U+FEFF для використання виключно як позначки порядку байтів BOM.

В UTF-16, BOM (U+FEFF) стоїть на місці першого символу файла або потоку літер, для того, аби вказати порядок 16-бітних символів у цьому файлі або потоці. Якщо 16-бітні символи записано в прямому порядку (англ. big-endian), позначку BOM буде зчитано як байти 0xFE і 0xFF; якщо порядок байт зворотний, послідовність BOM буде зчитано як 0xFF і 0xFE. Гарантується, що символ Юнікода з кодом U+FFFE ніколи не буде використовуватись для позначення літери в кодуванні Юнікода; із цього випливає, що в контексті Юнікода пара байт 0xFF і 0xFE може означати лише U+FEFF у зворотному порядку.

Не зважаючи на те, що UTF-8 не має проблем з порядком байтів, BOM, у цьому випадку, може використовуватись для позначення тексту в кодуванні UTF-8. Ця позначка лише позначає кодування файла, а не порядок байт в ньому[1]. Достатньо велика кількість програмного забезпечення виробництва Microsoft, (наприклад блокнот) додає позначку BOM. Однак, на Юнікс-подібних системах, застосування позначки BOM може перешкоджати нормальній обробці файлів.

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

ред.
Кодування Представлення (шістнадцяткове)
UTF-8 EF BB BF *
UTF-16 Прямий порядок FE FF
UTF-16 Зворотний FF FE
UTF-32 Прямий порядок 00 00 FE FF
UTF-32 Зворотний FF FE 00 00
SCSU 0E FE FF
UTF-7 2B 2F 76
та один із наступних байтів: [ 38 | 39 | 2B | 2F ]
UTF-EBCDIC DD 73 66 73
BOCU-1 FB EE 28

* В UTF-8, BOM, насправді, використовується лише для позначення кодування тексту. Ця позначка лише позначає кодування файла, а не порядок байтів в ньому.[1]

† В UTF-7, четвертий байт послідовності BOM, перед кодуванням base64 дорівнює 001111xx у двійковій формі, а xx залежить від наступного байту.

При використанні UTF-8 для зберігання php-файлів можуть виникнути проблеми з заголовками які відправляє httpd. Оскільки BOM фізично знаходиться до <?php, то відправляється першим, що може призвести до неможливості додання інших заголовків, включаючи cookies.
Щоб цього уникнути, зберігайте php-файли в кодуванні UTF-8 без BOM (Наприклад, у Notepad++: Кодування → Перетворити в UTF-8 без BOM; Опції → Налаштування → Створити документ → Кодування: UTF-8 без мітки BOM).

Примітки

ред.
  1. а б FAQ — UTF-8, UTF-16, UTF-32 & BOM [Архівовано 3 вересня 2012 у Wayback Machine.](англ.)

Див. також

ред.

Посилання

ред.