
Я записываю целочисленные значения в файл из 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 для кода обнаружения.)