что подразумевается под спецификацией?

Что подразумевается под BOM? Я пробовал читать эту статью, но не очень понял, что это значит.

Я читал, что некоторые текстовые редакторы помещают спецификацию перед началом файла. Для чего он предназначен?


person Y.E.P    schedule 12.10.2012    source источник
comment
Он предназначен для того, чтобы сообщить читателю, какая кодировка использовалась, чтобы ее можно было декодировать.   -  person Peter Lawrey    schedule 12.10.2012
comment
Я предполагаю, что тег Java был добавлен по какой-то причине, даже если OP явно не ссылался на него. У Java есть некоторые особенности, когда дело доходит до обработки символов Unicode, поэтому это может изменить ответы.   -  person Duncan Jones    schedule 12.10.2012
comment
Почему это закрыто? это хороший вопрос. А также OP может захотеть получить ответы с кодом Java, API и т. д., поэтому OP добавил тег java.   -  person acegs    schedule 06.04.2019


Ответы (4)


BOM означает Byte Order Mark. Короче говоря, BOM — это маркер в начале файла, указывающий, должен ли быть первым старший байт или младший значащий байт.

Это вызывает много проблем, особенно с UTF8. UTF8 не использует спецификацию, но есть вариант под названием UTF8Y (или UTF со спецификацией), который включает несколько дополнительных символов в начале файла.

Отправка файла UTF8Y с типом кодировки UTF8 приводит к отправке нескольких дополнительных байтов в начале файла и может вызвать всевозможные трудно отслеживаемые проблемы, включая неправильный анализ DOCTYPE в одном файле IE или JSON. не поддается расшифровке.

Несколько раз он укусил меня за файлы от других людей, когда я не внимательно проверял тип файла.

Моя рекомендация: помните, что он существует, никогда не используйте его целенаправленно.

person Jeremy J Starcher    schedule 12.10.2012
comment
+1 за помните, что он существует, никогда не используйте его целенаправленно. - person Juvanis; 12.10.2012
comment
Я полностью согласен с бесполезностью спецификаций в UTF-8, но можете ли вы привести ссылку, где определяется UTF8Y или где UTF8 не использует спецификацию? Стандарт Unicode разрешает спецификации в UTF8 (но указывает, что они бессмысленны), и я также не могу найти ссылку на UTF8Y в спецификации. - person Duncan Jones; 12.10.2012
comment
Сказав это, Google предоставляет много результатов для UTF8Y. Так что, возможно, это обычное отклонение от чистой спецификации? - person Duncan Jones; 12.10.2012
comment
@DuncanJones - я знаю термин UTF8Y только от одного из моих редакторов на работе (либо jEdit, либо Notepad++). Согласно этой диаграмме, UTF8 не имеет спецификации. ER, позже это указывает на то, что спецификация является необязательной, но не влияет на фактический порядок байтов. Похоже, что UTF8Y — это официальное имя, чтобы отделить его от UTF8 without BOM.. - person Jeremy J Starcher; 12.10.2012
comment
UTF8 не использует спецификацию, но есть вариант под названием UTF8Y (или UTF со спецификацией), который включает несколько дополнительных символов в начале файла. Имя UTF-8 without BOM, но некоторые дополнительные символы включен в файл ! Что имеется в виду? - person Y.E.P; 14.10.2012

Метка порядка байтов позволяет программе определить, как читать данные Unicode. С вашей вики-страницы:

Поскольку Unicode может быть закодирован как 16-битные или 32-битные целые числа, компьютер, получающий эти кодировки из произвольных источников, должен знать, в каком порядке байтов закодированы целые числа.

Для UTF-8 нет никакой двусмысленности в отношении того, как читать байты, поэтому спецификация часто опускается. Для UTF-16 и UTF-32 необходимо знать, как интерпретировать байты, и для этой цели может служить спецификация.

Обратите внимание, что у Java есть проблемы с чтением спецификаций UTF-8, и вы должны вручную обрабатывать эти символы, если они есть (см. Чтение UTF-8 - BOM marker для некоторых ссылок на соответствующие ошибки Sun).

person Duncan Jones    schedule 12.10.2012
comment
+1 за внимание к проблемам с Java. - person Jeremy J Starcher; 12.10.2012
comment
Да, это был потраченный впустую день на поиски этого :-) WTF, этот вопросительный знак все еще здесь?! - person Duncan Jones; 12.10.2012

Я, вероятно, собираюсь рассказать о том, что вы уже знаете, но вот...

Чтобы понять назначение спецификации, вам нужно понять (по крайней мере, концептуально), что такое порядок следования байтов.

Если вы имеете дело с одним байтом (8 двоичных битов), он упорядочен по возрастанию значимости справа налево (точно так же, как при чтении обычного десятичного числа, например «19»). Это достаточно просто, если вы можете содержать число в одном байте. Как только вы доберетесь до двух байтов, вам нужно знать, какой из двух байтов является более значимым, то есть с прямым порядком байтов или с прямым порядком байтов. Big endian означает, что самый младший адрес памяти (или самый левый, если продолжить аналогию с записью) содержит более высокие значения — это продолжает тенденцию западных десятичных чисел. Исторически сложилось так, что Intel использует обратный порядок байтов, а Motorola — обратный порядок байтов. (Я не смотрел в последнее время, это может быть по-другому.)

Спецификация — это просто маркер, указывающий, как интерпретировать порядок байтов данных.

person Todd Sjolander    schedule 12.10.2012

Сегодня это просто означает: «Этот файл находится в кодировке UTF-8». Или «Этот файл находится в кодировке UTF-16». Хотя в обоих случаях это один и тот же символ спецификации, способ кодирования спецификации подразумевает, как будут кодироваться все остальные.

Если вы не знаете, что такое первый символ, вы не можете надежно вывести кодировку документа из него — вы должны определить его откуда-то еще или более или менее угадать.

Приложение после голосования:

Исторически сложилось так, что у BOM было другое назначение — пробельный символ нулевой ширины (то есть настолько невидимый, насколько может быть символ Unicode, но все же символ). Многие широко используемые программные библиотеки, такие как .NET и Java, автоматически или неявно добавляют спецификацию в записанные файлы или даже массивы байтов, что часто обманывает людей, заставляя их думать, что они не используют спецификацию, когда они это делают. Это часто имеет неприятные последствия, когда стек таких библиотек записывает несколько спецификаций в начало одного и того же файла, потому что тогда ваш файл начинается с недопустимого или нежелательного символа, неразрывного пробела нулевой ширины; и вы даже не видите его при осмотре!

Неудивительно, что метод BOM подходит не всем.

person Jirka Hanika    schedule 12.10.2012
comment
+1 Технически это будет UTF-16LE или UTF-16BE ;) - person Peter Lawrey; 12.10.2012
comment
@PeterLawrey - Спасибо, и да. Я намеренно упрощаю тему. - person Jirka Hanika; 12.10.2012