UTF-8 против UTF-8 с спецификацией
В последней версии Notepad.exe есть функция Сохранить как
UTF-8
и
UTF-8 with BOM
.
Является
UTF-8 with BOM
Старый
UTF
? Что такое
UTF-8
в настоящее время?
2 ответа
UTF-8 - это UTF-8 независимо от того, существует ли спецификация.
Сохранение файла со спецификацией (меткой порядка байтов) для UTF-8 не требуется.
Тот факт, что Блокнот позволяет сохранять файлы в "UTF-8" или "UTF-8 со спецификацией", кажется, является опцией, которая существует для обеспечения гибкости в случаях, когда требуется спецификация (отметка порядка байтов). Но в целом просто сохранение файла без спецификации - что означает простой UTF-8 - действительно лучший способ обработки текстовых файлов с содержимым UTF-8.
Как объяснено на странице Википедии для отметки порядка байтов:
"Использование спецификации не является обязательным. Его присутствие мешает использованию UTF-8 программным обеспечением, которое не ожидает байтов, отличных от ASCII, в начале файла, но которое в противном случае могло бы обрабатывать текстовый поток ".
И статья углубляется в это, заявляя следующее; жирный акцент мой:
"Представление спецификации UTF-8 - это (шестнадцатеричная) последовательность байтов.
0xEF,0xBB,0xBF
.Стандарт Unicode разрешает спецификацию в UTF-8, но не требует и не рекомендует ее использование. Порядок байтов не имеет значения в UTF-8, поэтому его единственное использование в UTF-8 - это сигнализировать в начале, что текстовый поток закодирован в UTF-8 или что он был преобразован в UTF-8 из потока, содержащего необязательная спецификация. Стандарт также не рекомендует удалять спецификацию, когда она есть, чтобы при циклическом переключении между кодировками информация не терялась, и чтобы код, который на нее полагается, продолжал работать. IETF рекомендует, чтобы если протокол либо (а) всегда использует UTF-8, либо (б) имеет другой способ указать, какая кодировка используется, то ему "СЛЕДУЕТ запретить использование U+FEFF в качестве подписи".
Отсутствие спецификации позволяет обеспечить обратную совместимость текста с некоторым программным обеспечением, не поддерживающим Unicode. Примеры включают языки программирования, которые разрешают байты, отличные от ASCII, в строковых литералах, но не в начале файла ".
Что касается того, почему Microsoft заботится о сохранении UTF-8 с BOM в Блокноте? Это хорошо объясняет; кажется, это особое требование к инструментам программирования Microsoft, а не к любому другому инструменту стороннего производителя:
"Компиляторы и интерпретаторы Microsoft, а также многие компоненты программного обеспечения в Microsoft Windows, такие как Notepad, рассматривают BOM как необходимое магическое число, а не используют эвристику. Эти инструменты добавляют спецификацию при сохранении текста как UTF-8 и не могут интерпретировать UTF-8, если только спецификация не присутствует или файл не содержит только ASCII. Google Docs также добавляет спецификацию при преобразовании документа в простой текстовый файл для загрузки ".
Поэтому, если вам явно не нужно сохранять файл UTF-8 со спецификацией, которая будет установлена для файла, просто не беспокойтесь об этой опции сохранения.
Другой ответ неверен. Это какая-то политическая вещь. ANSI - это текстовый формат по умолчанию в Windows, который существует уже 36 лет.
В Windows файлы считаются файлами ANSI. Поэтому вы всегда используете спецификацию. Программы Unix, которые не могут обрабатывать спецификации, не совместимы с Unicode.
Пишу текстовые редакторы. Если пользователь не указывает, это ANSI - ВСЕГДА.
Предполагая, что вы получите Unicode без спецификации, вам нужно позвонить по https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-istextunicode, чтобы угадать формат. Вряд ли правильное программирование.