Кракозябры в TXT: CP1251, KOI8-R и как это чинить
Вы открываете .txt, а вместо русских букв — набор непонятных знаков. Файл при этом цел. Байты на месте, просто их читают не по той таблице.
Почему так выходит
Обычный текстовый файл не сообщает о своей кодировке ничего. Это просто последовательность байтов, а как её толковать — решает открывающая программа.
Русские файлы девяностых и двухтысячных — это, как правило, CP1251, реже KOI8-R и совсем редко CP866.
| Кодировка | Откуда обычно берётся |
|---|---|
| UTF-8 | нынешний стандарт |
| CP1251 | Windows, большинство старых русских файлов |
| KOI8-R | Unix и ранний рунет, рассылки, FTP-архивы |
| CP866 | DOS, файлы из очень старых программ |
| UTF-16 | выгрузка некоторых программ Windows |
Как понять, какая именно
У каждой кодировки свой характерный вид поломки, и по нему обычно можно угадать с первого раза.
CP1251, прочитанная как UTF-8 или Latin-1. Самый частый случай. Каждая русская буква превращается в пару латинских символов с диаксиками, и текст на экране становится примерно вдвое длиннее исходного.
KOI8-R, прочитанная как CP1251. Особый случай, который ни с чем не спутать: получается связный, но бессмысленный русский текст. В KOI8-R буквы расставлены так, что при неверном чтении выходят опять же кириллические знаки, только другие. Если вы видите «руническую» кириллицу, которая выглядит как слова, но не читается, — это почти наверняка KOI8-R.
CP866. В тексте появляются символы псевдографики, которыми в DOS рисовали рамки.
Что делает приложение сейчас
Лучше сказать прямо. Aurora Reader сначала пробует UTF-8, а при неудаче откатывается на Latin-1. Ни CP1251, ни KOI8-R оно не распознаёт, и выбрать кодировку в настройках нельзя.
Latin-1 заодно объясняет, почему вы видите кракозябры, а не сообщение об ошибке. В этой кодировке любой байт чему-нибудь да соответствует, поэтому запасной путь всегда «срабатывает» — просто выдаёт не тот текст.
Это поведение записано как ошибка.
Как починить
Перекодируйте копию на компьютере и верните файл на телефон.
iconv -f CP1251 -t UTF-8 kniga.txt > kniga-utf8.txt
Если вышло всё равно нечитаемо, попробуйте -f KOI8-R, а затем -f CP866. Перебор из трёх вариантов закрывает почти все случаи.
В Windows можно открыть файл Блокнотом и пересохранить, указав UTF-8. На больших файлах это медленно.
Работайте только с копией: неверно указанная кодировка при перекодировке необратима.
Когда ломаются имена файлов, а не текст
Бывает наоборот: текст внутри нормальный, а имена файлов из архива — кракозябры.
Это другая история. Формат ZIP долго не оговаривал кодировку имён, и архиваторы Windows записывали их в CP1251, тогда как распаковщики на Android читают их как UTF-8. Содержимое при этом не страдает.
Если файлов немного, проще переименовать вручную. Если много — распакуйте на компьютере архиватором, где кодировку имён можно задать, и перенесите уже потом.
Пустое оглавление — это не про кодировку
Отдельный случай: буквы правильные, а оглавление пустое.
Приложение ищет заголовки по английским образцам вроде Chapter 1 и Part 2, а «Глава 5» и «Часть II» под них не подходят. Тот же участок кода считает слова по пробелам, из-за чего сбивается и оценка числа страниц. Оба пункта заведены отдельно: распознавание глав и подсчёт слов.
Это не повреждение файла
Повреждённый файл обычно не открывается вовсе или обрывается на середине. Если книга ровно и до конца показывает неправильные буквы, байты целы. Разница разобрана в признаках повреждённого файла.
Переименование не помогает: расширение никак не связано с содержимым.
Если буквы правильные, но выглядят странно
Тогда дело в шрифте, а не в кодировке. Шрифт без кириллицы либо подставляет чужие начертания, либо рисует пустые прямоугольники. Дореволюционная орфография с «ять» и «фитой» требует шрифта с этими знаками.
Решается подключением своего шрифта.
Чтобы не повторялось
Если та же книга есть в FB2 или EPUB, берите её. Оба формата объявляют кодировку внутри файла, и проблема просто не возникает. Ради этого стоит заглянуть в Викитеку, которая умеет отдавать EPUB.