Interested Article - Маркер последовательности байтов

Маркер последовательности байтов или метка порядка байтов ( англ. byte order mark, BOM ) — специальный символ из стандарта Юникод , вставляемый в начало текстового файла или потока для обозначения того, что в файле (потоке) используется Юникод, а также для косвенного указания кодировки и порядка байтов , с помощью которых символы Юникода были закодированы. Номер этого символа в стандарте Юникод — U+FEFF . Использование этого символа, согласно спецификации Юникод, не является обязательным, однако оно широко распространено, так как позволяет легко избежать неверного декодирования текстовой информации.

Использование

Согласно спецификации Юникода, маркер может стоять только в самом начале файла или потока. Если же символ U+FEFF встречается в середине потока данных, он должен [ источник не указан 1943 дня ] интерпретироваться как «нулевой ширины неразрывный пробел» (по существу, неотображаемый и ничего не меняющий символ). Однако, большинство [ сколько? ] браузеров, кроме 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
2B 2F 76 39
2B 2F 76 2B
2B 2F 76 2F
43 47 118 56
43 47 118 57
43 47 118 43
43 47 118 47
+/v8
+/v9
+/v+
+/v/
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 � — коды без значений
  1. В этих кодировках последовательность не определяет именно порядок байтов, так как кодировка однобайтная, но эта последовательность может использоваться для определения способа кодировки.
  2. В UTF-7 в связи с использованием base-64 четвёртый байт BOM является 001111xx в двоичном представлении, где xx зависит от следующего символа (первого после BOM). Поэтому четвёртый байт не является только частью BOM, но также содержит информацию о следующем (не BOM-) символе. Для xx=00 , 01 , 10 , 11 четвёртый байт будет, соответственно, 38 , 39 , 2B или 2F при кодировке в base64. Если же следующий символ не кодируется base64, то используется 38 в качестве четвёртого байта, а следующий байт — 2D .
  3. SCSU предусматривает и другие кодировки для U+FEFF, указанная последовательность является рекомендованной в UTR #6.

Сложности, которые необходимо учитывать при использовании маркера

Есть случаи, когда использования маркера последовательности байтов следует избегать, несмотря на удобства его применения. Например, использование маркера в веб-шаблонах вызывает появление пустых строк в документе, поэтому рекомендуется удалять маркер из веб-скриптов и CSS -файлов. А наличие маркера в начале файлов PHP (до тега <?php ) приводит к тому, что пустая строка отправляется клиенту ещё до начала выполнения кода, что вызывает сбой в тех случаях, когда клиенту должен сразу отправиться HTTP-заголовок (при переадресации запроса, например). Также может неверно отрабатывать json_decode , если json записан в файл с BOM.

Примечания

  1. (англ.) . www.w3.org. Дата обращения: 19 сентября 2018. 17 августа 2018 года.
  2. Дата обращения: 4 января 2009. 1 сентября 2012 года.
  3. от 25 октября 2011 на Wayback Machine Byte Order Mark (BOM)
  4. . Дата обращения: 18 октября 2011. 6 октября 2011 года.
  5. . Дата обращения: 3 мая 2017. 13 июня 2017 года.
Источник —

Same as Маркер последовательности байтов