Блокнот отображает содержимое файла txt в виде странных символов

Блокнот отображает содержимое файла txt в виде странных символов

Я записываю целочисленные значения в файл из Kotlin (тип Kotlin Int) используя что-то вроде этого

var1BufferedWriter?.write(String.format("%d\n", intvar ) )   
var2BufferedWriter?.write(String.format("%08x\n", intvar ) )    

var1выше записывается в textfile.txtи var2в textfile_hex.txt. Оба сохраняются в память sdcard телефона android. Когда я копирую их на компьютер с Windows и открываю их в блокноте, textfile.txt выглядит так

введите описание изображения здесь

в то время как textfile_hex.txt выглядит так:

введите описание изображения здесь

Если я открываю textfile.txt в шестнадцатеричном редакторе, я вижу, что все данные в файле верны и соответствуют тому, что я ожидал. Notepad++ тоже все правильно показывает. Самое странное, что я использовал это же приложение до выходных, чтобы сгенерировать много других файлов, похожих на textfile.txt, и все они выглядели нормально в Windows. Ничего не было изменено в настройках Android или Notepad.

Это нормальное поведение? Это какая-то проблема с кодировкой? Почему блокнот отображает некоторые txt-файлы правильно, а другие нет?

Версия Windows:
Издание Windows 10 Pro
Версия 22H2
Сборка ОС 19045.4046
Опыт Windows Feature Experience Pack 1000.19053.1000.0

решение1

Файл запускаетложно положительныйв определении «Является ли Unicode» в Блокноте. (Эта проблема дажесвоя страница в Википедии.)

  • Если ваш 'intvar' всегда равен нулю, то файл состоит исключительно из повторяющихся символов "0\n", которые хранятся в виде байтов {0x30, 0x0A}в ASCII (и/или в UTF-8).

    "0"  "\n"  "0"  "\n"  "0"  "\n"  ...
    30   0A    30   0A    30   0A    ...
    
  • Вы видите символ Unicode, "ਰ"он "\u0A30"жеУ+0А30, которыйтакжехранится в виде байтов {0x30, 0x0A}в кодировке UTF-16 LE.

    "ਰ"     "ਰ"     "ਰ"    ...
    30 0A   30 0A   30 0A  ...
    

Небольшое изменение вывода — например, добавление какого-либо «очевидно ASCII»-заголовка или комментария — позволило бы обойти эту проблему.

Вы также можете добавить к содержимому файла префикс "\xEF\xBB\xBF"(или "\uFEFF", в зависимости от того, какое написание предпочитает Java/Kotlin), который является стандартным заголовком, указывающим на то, что файл имеет кодировку UTF-8 и заставит Блокнот (и все другие текстовые редакторы) пропустить автоматическое определение.

Если Android поддерживает это, вы можете записать файл какдействительныйUTF-16 (предпочтительно с включенным BOM, чтобы обойти эту часть определения формата).

(Возможно, другие файлы не вызывают эту проблему, поскольку в них есть по крайней мере одно значение ≥10, которое «смещает» байты так, что они выглядят немного больше как ASCII и немного меньше как UTF-16 для кода обнаружения.)

Связанный контент