Почему текстовые редакторы считают этот файл UTF-8?

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? Учитывая, что файл не имеет заголовка спецификации, почему это происходит, и что уникально во втором файле по сравнению с первым файлом, который вызывает это? Я не могу понять, что происходит.

Джейсон С
источник
Это происходит время от времени в разных местах. Взгляните на проблему с кодировкой файла Блокнот, redux .
CVN

Ответы:

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 ++ на моем ПК

WMZ
источник