Зачем мне использовать знак порядка байтов подписи в Юникоде (BOM)?

StackOverflow https://stackoverflow.com/questions/1045663

Вопрос

Являются ли они устаревшими?Они кажутся наихудшей идеей на свете - встроить что-то в содержимое вашего файла, что никто не может видеть, но влияет на функциональность файла.Я не понимаю, зачем мне это нужно.

Это было полезно?

Решение

Да, в некоторых случаях они необходимы, потому что существуют как младшие, так и большие реализации UTF-16.

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

Это то, что делает спецификация.

И нужен ли он вам?Только если вы 1) используете кодировку UTF, где конечность является проблемой (это имеет значение для UTF-16, но UTF8 всегда выглядит одинаково, независимо от порядкового номера), и файл будет передан внешним приложениям в общий доступ.

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

Другие советы

Некоторые выдержки из Часто ЗАДАВАЕМЫЕ ВОПРОСЫ по UTF и спецификации от Консорциума Unicode может быть полезно.

Q:Что такое спецификация?

A: Метка порядка байтов (BOM) состоит из символьного кода U+ FEFF в начале потока данных, где он может использоваться в качестве подписи, определяющей порядок байтов и форму кодирования, в основном для немаркированных файлов открытого текста.В соответствии с некоторыми протоколами более высокого уровня использование спецификации может быть обязательным (или запрещено) в потоке данных Unicode, определенном в этом протоколе. (Курсив мой.)

Я бы точно не сказал, что метка порядка байтов равна встроенный в данных.Скорее, это префиксы данные.Символ является знаком порядка байтов только тогда, когда он является первым в потоке данных.В любом другом месте, и это неразрывный пробел нулевой ширины.Поддерживающие Юникод программы, которые не соблюдают знак порядка байтов, на самом деле не страдают от его присутствия в любом случае, поскольку символ невидим, а средство объединения слов в начале блока текста просто ни к чему не присоединяет следующий символ, так что это не имеет никакого эффекта.

Q:Где спецификация полезна?

A: Спецификация полезна в начале файлов, которые набраны как текст, но для которых неизвестно, в формате big или little endian — это также может служить подсказкой, указывающей на то, что файл в Юникоде, в отличие от устаревшей кодировки, и, кроме того, она действует как подпись для конкретной используемой формы кодирования.

Итак, вам понадобится спецификация, когда ваша программа способна обрабатывать несколько кодировок Unicode.Как еще ваша программа узнает, какую кодировку использовать при интерпретации ее входных данных?

Q:Когда используется спецификация, используется ли она только в 16-битном тексте в Юникоде?

A: Нет, спецификация может использоваться в качестве подписи независимо от того, как преобразуется текст в Юникоде:UTF-16, UTF-8, UTF-7 и т.д.Точными байтами, составляющими спецификацию, будут все символы Юникода U + FEFF, преобразованные в этот формат преобразования.В этой форме спецификация служит для указания как того, что это файл в формате Unicode, так и того, в каком из форматов он находится.

Вероятно, это тот случай, когда спецификация используется сегодня наиболее часто.Он отличает текст в кодировке UTF-8 от любых других кодировок;на самом деле это не маркировка порядка байтов, поскольку UTF-8 имеет только один порядок.

Если вы разрабатываете свой собственный протокол или формат данных, вам не обязательно использовать спецификацию.Другой вопрос из FAQ касается этого:

Q:Как мне пометить данные, которые не интерпретируют U + FEFF как спецификацию?

A: Используйте тег UTF-16BE для обозначения текста в формате UTF-16 в формате big-endian, а UTF-16LE - для обозначения текста в формате UTF-16 в формате little-endian.Если вы используете спецификацию, пометьте текст просто как UTF-16.

В нем упоминается концепция пометка формат ваших данных.Это означает указание формата внеполосный из самих данных.Это здорово, если у вас есть такая возможность, но часто это не так, особенно когда старые системы перестраиваются под Unicode.

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

Однако UTF-8 не требует спецификации.

Ознакомьтесь с Статья в Википедии.

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

"Спецификация" - это пережиток ранних дней Unicode, когда предполагалось, что использование Unicode будет означать использование 16-разрядных символов.Это совершенно бессмысленно в такой кодировке, как UTF-8, которая имеет только один порядок байтов.Выбор U + FEFF также неоптимален для UTF-32, поскольку он не может различать все возможные порядки байтов в середине строки (для этого потребуется спецификация, закодированная с помощью 4 другой байты).

Единственная причина, по которой вы бы использовали его, - это отправка данных UTF-16 или UTF-32 между платформами с разным порядком байтов, но (1) большинство людей все равно используют UTF-8 и (2) MIME charset параметр обеспечивает лучший механизм.

UTF16 и UTF32 могут быть записаны как в формате Big-Endian, так и в формате Little-Endian.Вы могли бы попытаться эвристически определить порядок следования, проанализировав результат обработки файла в любом порядке, но, чтобы избавить вас от лишних хлопот, спецификация может сообщить вам об этом сразу.

Однако UTF-8 на самом деле не нуждается в спецификации, поскольку вы декодируете ее побайтно.

Независимо от того, используете ли вы их сами при создании текстовых файлов, вероятно, стоит помнить об этом при чтении текстовых файлов.т. е.обнаруживайте и пропускайте (и в идеале обрабатывайте соответствующим образом) спецификацию в начале файла.Я столкнулся с несколькими, у которых это было и которые изначально вызывали у меня некоторые проблемы, пока я не разобрался, что происходит.

Поскольку спецификации UTF16 и UTF32 указывают, находится ли содержимое в формате Big-Endian или Little-Endian, а также то, что содержимое является Unicode, спецификация UTF-8 классифицирует файл в кодировке utf-8.Без спецификации UTF-8, как вы можете узнать, является ли это файлом ANSI или файлом в кодировке UTF-8?Спецификация UTF-8, конечно, не указывает конечность, потому что utf-8 всегда является потоком байтов, но она сообщает, имеет ли содержимое кодировку utf-8 в Unicode или ANSI.Конечно, вы можете отсканировать допустимые последовательности utf-8, но, на мой взгляд, проще проверить первые три байта файла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top