Лучшие вопросы
Таймлайн
Чат
Перспективы
Маркер последовательности байтов
символ Юникода Из Википедии, свободной энциклопедии
Remove ads
Маркер последовательности байтов или метка порядка байтов (англ. byte order mark, BOM) — специальный символ из стандарта Юникод, вставляемый в начало текстового файла или потока для обозначения того, что в файле (потоке) используется Юникод, а также для косвенного указания кодировки и порядка байтов, с помощью которых символы Юникода были закодированы. Номер этого символа в стандарте Юникод — U+FEFF
. Использование этого символа, согласно спецификации Юникод, не является обязательным, однако оно широко распространено, так как позволяет легко избежать неверного декодирования текстовой информации.
Remove ads
Использование
Согласно спецификации Юникода, маркер может стоять только в самом начале файла или потока. Если же символ U+FEFF
встречается в середине потока данных, он должен[источник не указан 2494 дня] интерпретироваться как «нулевой ширины неразрывный пробел» (по существу, неотображаемый и ничего не меняющий символ). Однако, большинство[сколько?] браузеров, кроме Opera версий 12 и ниже, воспринимают BOM в середине документа как символ, занимающий целую строку, после чего генерируют перенос строки[1].
Для неразрывного пробела нулевой ширины в Юникоде есть и отдельный специальный символ — U+2060
, который и рекомендуется использовать в этом качестве, а маркер последовательности байтов U+FEFF
рекомендуется использовать только по своему прямому назначению.
Если формат представления символов Юникода точно известен принимающей программе заранее, то по стандарту Юникода маркер ставить не следует. И если формат объявлен другим способом (например, MIME в поле заголовка Content-Type
), маркер по стандарту ставить не полагается.
Remove ads
Определение кодировки по маркеру последовательности байтов
Суммиров вкратце
Перспектива
По тому, как закодирован маркер последовательности байтов, стоящий в начале файла или потока, можно легко определить кодировку и порядок байтов, использованные для кодирования символов Юникода во всём данном файле или потоке. Это обстоятельство в основном и явилось причиной широкого использования маркера последовательности байтов.
- В UTF-7 в связи с использованием base-64 четвёртый байт BOM является
001111xx
в двоичном представлении, гдеxx
зависит от следующего символа (первого после BOM). Поэтому четвёртый байт не является только частью BOM, но также содержит информацию о следующем (не BOM-) символе. Дляxx=00
,01
,10
,11
четвёртый байт будет, соответственно,38
,39
,2B
или2F
при кодировке в base64. Если же следующий символ не кодируется base64, то используется38
в качестве четвёртого байта, а следующий байт —2D
.
Remove ads
Сложности, которые необходимо учитывать при использовании маркера
Есть случаи, когда использования маркера последовательности байтов следует избегать, несмотря на удобства его применения. Например, использование маркера в веб-шаблонах вызывает появление пустых строк в документе, поэтому рекомендуется удалять маркер из веб-скриптов и CSS-файлов. А наличие маркера в начале файлов PHP (до тега <?php
) приводит к тому, что пустая строка отправляется клиенту ещё до начала выполнения кода, что вызывает сбой в тех случаях, когда клиенту должен сразу отправиться HTTP-заголовок (при переадресации запроса, например).[5] Также может неверно отрабатывать json_decode, если json записан в файл с BOM.
Примечания
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads