Порядок байтов
- 1 year ago
- 0
- 0
Маркер последовательности байтов
или
метка порядка байтов
(
англ.
byte order mark, BOM
) — специальный символ из стандарта
Юникод
, вставляемый в начало текстового файла или потока для обозначения того, что в файле (потоке) используется Юникод, а также для косвенного указания
кодировки
и
порядка байтов
, с помощью которых символы Юникода были закодированы. Номер этого символа в стандарте Юникод —
U+FEFF
. Использование этого символа, согласно спецификации Юникод, не является обязательным, однако оно широко распространено, так как позволяет легко избежать неверного декодирования текстовой информации.
Согласно спецификации Юникода, маркер может стоять только в самом начале файла или потока. Если же символ
U+FEFF
встречается в середине потока данных, он должен
[
источник не указан 1987 дней
]
интерпретироваться как «нулевой ширины неразрывный пробел» (по существу, неотображаемый и ничего не меняющий символ). Однако, большинство
[
сколько?
]
браузеров, кроме Opera версий 12 и ниже, воспринимают BOM в середине документа как символ, занимающий целую строку, после чего генерируют перенос строки
.
Для неразрывного пробела нулевой ширины в Юникоде есть и отдельный специальный символ —
U+2060
, который и рекомендуется использовать в этом качестве, а маркер последовательности байтов
U+FEFF
рекомендуется использовать только по своему прямому назначению.
Если формат представления символов Юникода точно известен принимающей программе заранее, то по стандарту Юникода маркер ставить не следует. И если формат объявлен другим способом (например,
MIME
в поле заголовка
Content-Type
), маркер по стандарту ставить не полагается.
По тому, как закодирован маркер последовательности байтов, стоящий в начале файла или потока, можно легко определить кодировку и порядок байтов, использованные для кодирования символов Юникода во всём данном файле или потоке. Это обстоятельство в основном и явилось причиной широкого использования маркера последовательности байтов.
Кодировка | Представление маркера последовательности байтов | Представление маркера при ошибочном раскодировании другой кодировкой | |||||
---|---|---|---|---|---|---|---|
Шестнадцатеричный код | Десятичный код | ISO-8859-1 | KOI8-R | CP1251 | CP866 | комментарий | |
UTF-8 |
EF BB BF
|
239 187 191
|

|
О╩©
|
п»ї
|
я╗┐
|
|
UTF-16 ( BE ) |
FE FF
|
254 255
|
þÿ
|
ЧЪ
|
юя
|
■
|
пробел — неразрывный |
UTF-16 ( LE ) |
FF FE
|
255 254
|
ÿþ
|
ЪЧ
|
яю
|
■
|
|
UTF-32 (BE) |
00 00 FE FF
|
0 0 254 255
|
␀␀þÿ
|
␀␀ЧЪ
|
␀␀юя
|
␀␀■
|
␀ — NUL , пробел — неразрывный |
UTF-32 (LE) |
FF FE 00 00
|
255 254 0 0
|
ÿþ␀␀
|
ЪЧ␀␀
|
яю␀␀
|
■␀␀
|
|
UTF-7 |
2B 2F 76 38
|
43 47 118 56
|
+/v8
|
||||
F7 64 4C
|
247 100 76
|
÷dL
|
|||||
UTF-EBCDIC |
DD 73 66 73
|
221 115 102 115
|
Ýsfs
|
||||
0E FE FF
|
14 254 255
|
␎þÿ
|
|
|
␎■
|
␎ — упр. символ , пробел — неразрывный | |
FB EE 28
|
251 238 40
|
ûî
|
|
|
√ю(
|
||
84 31 95 33
|
132 49 149 51
|
�1�3
|
|
|
Д1Х3
|
� — коды без значений |
001111xx
в двоичном представлении, где
xx
зависит от следующего символа (первого после BOM). Поэтому четвёртый байт не является только частью BOM, но также содержит информацию о следующем (не BOM-) символе. Для
xx=00
,
01
,
10
,
11
четвёртый байт будет, соответственно,
38
,
39
,
2B
или
2F
при кодировке в base64. Если же следующий символ не кодируется base64, то используется
38
в качестве четвёртого байта, а следующий байт —
2D
.
Есть случаи, когда использования маркера последовательности байтов следует избегать, несмотря на удобства его применения. Например, использование маркера в
веб-шаблонах
вызывает появление пустых строк в документе, поэтому рекомендуется удалять маркер из веб-скриптов и
CSS
-файлов. А наличие маркера в начале файлов
PHP
(до тега
<?php
) приводит к тому, что пустая строка отправляется клиенту ещё до начала выполнения кода, что вызывает сбой в тех случаях, когда клиенту должен сразу отправиться
HTTP-заголовок
(при переадресации запроса, например).
Также может неверно отрабатывать
json_decode
, если
json
записан в файл с BOM.