Ма́ркер поря́дку ба́йтів (англ. Byte-order mark, BOM) — символ Юнікоду U+FEFF ZERO WIDTH NO-BREAK SPACE («нерозривний пробіл нульової ширини»), що використовується для позначення порядку байтів у рядку символів Юнікоду, що закодовано в 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. Однак на Unix-подібних системах застосування позначки 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 залежить від наступного байта.
BOM, PHP, Apache та Unix-подібні ОС
При використанні UTF-8 для зберігання php-файлів можуть виникнути проблеми із заголовками які відправляє httpd. Оскільки BOM фізично розташований до <?php, то відправляється першим, що може призвести до неможливості додання інших заголовків, включаючи кукі-файли.
Щоб цього уникнути, php-файли потрібно зберігати в кодуванні UTF-8 без BOM (Наприклад, у Notepad++: Кодування → Перетворити в UTF-8 без BOM; Опції → Налаштування → Створити документ → Кодування: UTF-8 без мітки BOM).
Примітки
- ↑ а б FAQ — UTF-8, UTF-16, UTF-32 & BOM [Архівовано 3 вересня 2012 у Wayback Machine.](англ.)
Див. також
- Юнікод
- Universal character set
- UTF-32
- UTF-16
- UTF-8
- Endianness (порядок байтів)
Посилання
- The Unicode Standard, розділ 13 (PDF) [Архівовано 12 липня 2006 у Wayback Machine.] (дивіться 13.6 — Specials)
- FAQ — UTF та BOM [Архівовано 10 травня 2009 у Wayback Machine.]