У меня есть два текстовых файла, на которые я даю ссылки на скачивание, а не вставку для точного сохранения их содержимого:
Оба этих текстовых файла состоят только из пробелов, символов возврата каретки, перевода строки и буквы X, и они должны быть в кодировке ASCII. Единственное различие между этими двумя файлами состоит в том, что во втором файле удалены начальные и конечные пустые строки и удалены некоторые начальные и конечные пробелы в каждой строке.
Первый файл не вызывает никаких проблем. По какой-то причине мои текстовые редакторы определяют второй файл как UTF-8:
- Блокнот при двойном щелчке по текстовому файлу отображает поврежденный текст:
- Блокнот, когда используется Файл → Открыть, работает нормально, пока я явно выбираю «ANSI»:
- Notepad ++, хотя файл отображается нормально, считает, что он закодирован как «UTF-8 (без спецификации)»:
В Notepad ++, даже если я выберу «преобразовать в ANSI» и сохраню файл, сохраненный файл будет байтовым, идентичным оригиналу, и оба редактора все равно обнаружат его как UTF-8!
Оба редактора не имеют проблем с первым файлом и правильно распознают его как ASCII (или ANSI).
Я посмотрел второй текстовый файл в шестнадцатеричном редакторе. Действительно, это не начинается с спецификации. Первые несколько байтов файла 20 20 20 20 20 20 20 20
, как и должно быть, поскольку он начинается с пробелов:
У меня вопрос: почему тогда и Блокнот, и Блокнот ++ определяют второй файл как UTF-8? Учитывая, что файл не имеет заголовка спецификации, почему это происходит, и что уникально во втором файле по сравнению с первым файлом, который вызывает это? Я не могу понять, что происходит.
источник
Ответы:
Оба этих файла являются действительными ASCII и UTF-8, так как они включают только кодовые точки <0x7F (иными словами, ни один байт не имеет значения больше 127).
Я предполагаю, что Notepad ++ и Notepad имеют различную эвристику [если допустимо несколько кодировок]:
N ++ просто предпочитает UTF-8,
Блокнот (утилита Win), кажется, смотрит на длину файла - если он четный (как ваш второй файл, который составляет 72 320 байт), чем обрабатывает его как UTF-16 (собственная кодировка Windows, которая в основном составляет 2 байта [не всегда, но это было вероятно перенесенный из более раннего UCS-2, который всегда был двухбайтовым]), и если он нечетный (как ваш первый файл - 78 045 байт), обрабатывает его как ASCII (однобайтовый).
Вы можете проверить это, добавив один пробел (или любой другой действительный символ ascii) в конце вашего первого файла, чтобы сделать длину равной - если вы откроете его в блокноте, он будет считать, что это Unicode и отображать «мусор»
кстати: оба файла распознаются как utf-8 в Notepad ++ на моем ПК
источник