6

У меня есть два текстовых файла, на которые я даю ссылки на скачивание, а не вставку для точного сохранения их содержимого:

Оба этих текстовых файла состоят только из пробелов, символов возврата каретки, перевода строки и буквы X, и они должны быть в кодировке ASCII. Единственное различие между этими двумя файлами заключается в том, что во втором файле удалены начальные и конечные пустые строки и удалены некоторые начальные и конечные пробелы в каждой строке.

Первый файл не вызывает никаких проблем. По какой-то причине мои текстовые редакторы определяют второй файл как UTF-8:

  • Блокнот при двойном щелчке по текстовому файлу отображает поврежденный текст:

  • Блокнот, когда используется Файл → Открыть, работает нормально, пока я явно выбираю "ANSI":

  • Notepad++, хотя и отображает файл нормально, считает, что он закодирован как «UTF-8 (без спецификации)»:

  • В Notepad++, даже если я выберу "преобразовать в ANSI" и сохраню файл, сохраненный файл будет байтовым, идентичным оригиналу, и оба редактора все равно обнаружат его как UTF-8!

  • Оба редактора не имеют проблем с первым файлом и правильно распознают его как ASCII (или ANSI).

Я посмотрел второй текстовый файл в шестнадцатеричном редакторе. Действительно, это не начинается с спецификации. Первые несколько байтов файла - 20 20 20 20 20 20 20 20 , как и должно быть, поскольку он начинается с пробелов:

У меня вопрос: почему тогда и Блокнот, и Блокнот ++ определяют второй файл как UTF-8? Учитывая, что файл не имеет заголовка спецификации, почему это происходит, и что уникально во втором файле по сравнению с первым файлом, который вызывает это? Я не могу понять, что происходит.

1 ответ1

5

Оба этих файла являются действительными 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++ на моем ПК

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .