UTF-8 - это особая кодировка.Все 7-битные ASCII-файлы также являются допустимыми UTF-8, и он также может кодировать каждый символ Unicode.
Часто вы получите совет сохранить как UTF-8 без спецификации.На практике очень маловероятно, чтобы файл в устаревшей кодировке (такой как кодовая страница 1252, Big5 или Shift-JIS) просто выглядел как действительный UTF-8, если это не намеренно неоднозначный контрольный пример.Многие программы, такие как веб-браузеры, хорошо знают, когда файл имеет формат UTF-8.Самое последнее программное обеспечение использует UTF-8 в качестве предпочтительной кодировки текста, если только оно не вынуждено использовать по умолчанию что-то другое для совместимости с прошлым веком.(Например, LaTeX изменил исходную кодировку по умолчанию на UTF-8 в апреле 2018 года, и движки LuaLaTeX и XeLaTeX делали то же самое годами.)
Есть некоторые типы документов со специальными требованиями.Например, кодировка веб-страниц по умолчанию теоретически - Windows 1252, хотя браузеры в реальном мире примут их лучшее предположение.В настоящее время наилучшей практикой в Интернете является сохранение в формате UTF-8 без спецификации.Вместо этого вы пишете внутри <head>
документа, <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
или <meta charset="utf-8"/>
. Это явно сообщает агенту пользователя, что такое кодировка символов.
С другой стороны, некоторые старые версии программного обеспечения ломаются.если они видят спецификацию или только распознают UTF-8, если есть спецификация.Microsoft в этом была особенно виновата, ее программное обеспечение не хочет ломать какие-либо файлы, которые раньше работали, и поэтому по сей день я сохраняю свои исходные файлы C как UTF-8 с BOM.Это единственный формат, который работает только на каждом компиляторе, который я использую: даже последняя версия MSVC может ошибиться, если вы не укажете ни BOM, ни правильный флаг командной строки, тогда как Clang поддерживает только UTF-8 и имеетнет возможности читать файлы в любой другой кодировке.Некоторые старые версии MSVC, которые мне когда-то пришлось использовать, вообще не могут понять UTF-8, если не существует спецификации, и не предоставляют никакого способа переопределить ее автоопределение.