Некоторые выдержки из UTF и BOM FAQ от Консорциума Unicode могут быть полезны.
В: Что такое спецификация?
A: Метка порядка байтов (BOM) состоит из кода символа U + FEFF в начале потока данных , где его можно использовать в качестве подписи, определяющей порядок байтов и форма кодирования, в основном из неотмеченных текстовых файлов. В некоторых протоколах более высокого уровня использование спецификации может быть обязательным (или запрещенным) в потоке данных Unicode, определенном в этом протоколе. (Выделение мое.)
Я бы точно не сказал, что метка порядка байтов встроена в данные . Скорее это префиксы данных. Символ является только меткой порядка байтов, когда он является первым в потоке данных. Где-нибудь еще, и это неразрывный пробел нулевой ширины . Программы, поддерживающие Юникод, которые не соблюдают метку порядка байтов, на самом деле не наносят вреда его присутствию, так как символ невидим, а объединитель слов в начале блока текста просто соединяет следующий символ с нулем, так что это не имеет никакого эффекта.
В: Где полезна спецификация?
A: Спецификация полезна в начале файлов, которые напечатаны как текстовые, но для которых неизвестно, имеют ли они формат с прямым или прямым порядком байтов - это также может служить подсказкой указывает, что файл в Unicode, в отличие от устаревшей кодировки, и, кроме того, он действует как подпись для конкретной используемой формы кодирования.
Итак, вам нужна спецификация, когда ваша программа способна обрабатывать несколько кодировок Unicode. Как еще ваша программа узнает, какую кодировку использовать при интерпретации ввода?
В: При использовании спецификации только в 16-битном тексте Unicode?
A: Нет, спецификацию можно использовать в качестве подписи независимо от того, как преобразуется текст Unicode: UTF-16, UTF-8, UTF-7 и т. Д. Точные байты, составляющие спецификацию будет любым символом Юникода U + FEFF, преобразованным в этот формат преобразования. В этой форме спецификация служит для указания того, что это файл Unicode и в каком формате он находится.
Вероятно, это тот случай, когда спецификация используется чаще всего сегодня. Он отличает текст в кодировке UTF-8 от любых других кодировок; на самом деле он не помечает порядок байтов, поскольку UTF-8 имеет только один порядок.
Если вы разрабатываете свой собственный протокол или формат данных, вам не нужно использовать спецификацию. Еще один вопрос из FAQ касается:
В: Как пометить данные, которые не интерпретируют U + FEFF как спецификацию?
A: Используйте тег UTF-16BE для обозначения текста UTF-16 с прямым порядком байтов и UTF-16LE для обозначения текста UTF-16 с прямым порядком байтов. Если вы используете спецификацию, отметьте текст как UTF-16.
В нем упоминается концепция тегирования формата ваших данных. Это означает указание формата вне диапазона из самих данных. Прекрасно, если такая возможность доступна для вас, но часто это не так, особенно когда старые системы переоборудуются под Unicode.