Это не "ASCII" и не "ASCII русский".
До того, как Unicode получил широкое распространение, большинство компьютерных систем использовали кодировки символов ISO-8859, которых было 16, каждая для своего региона (центральноевропейская, кириллическая, греческая ...). У Windows были свои «кодовые страницы», очень похожие, но с дополнительными символами в неиспользуемых диапазонах. Все эти кодировки символов 8-битные и отличаются только во второй половине (128-255).
Проблема с этими кодировками заключается в том, что для программы практически невозможно определить, какая кодировка использовалась для сохранения файла, если только он не был указан явно (например, на страницах HTML; однако в простых текстовых файлах нет таких тегов метаданных). Прочитайте статью Wikipedia о Mojibake для более подробного описания.
В вашем примере документ был сохранен с использованием Windows-1251 (кириллица), но ваша программа читает его так, как если бы это был Windows-1252 (западноевропейский), который имеет очень разные символы в одинаковых позициях. Для компьютера это выглядит совершенно нормально - он не понимает языков или сценариев. (Есть программы, которые выполняют статистический анализ, чтобы определить правильную кодировку, хотя - некоторые веб-браузеры имеют такую функцию.)
Есть несколько способов конвертировать такой текст в Unicode:
Используйте онлайн-инструменты, такие как этот или этот.
Используйте свой веб-браузер:
Перетащите файл .txt
в браузер.
В меню « Просмотр» → «Кодировка символов» (или Firefox → «Веб-разработчик» → «Кодировка символов», или « Ключ» → «Инструменты» → «Кодировка») выберите правильную исходную кодировку: «Кириллица (Windows-1251)» в вашем случае.
Используйте текстовый редактор Notepad2 :
Откройте файл.
В меню «Файл» → «Кодировка» → «Перекодировать» выберите правильную исходную кодировку.
Используйте GNU iconv
с двоичными файлами Windows из GnuWin32 или Gettext для Win32.
iconv -f cp1251 -t utf-8 < myfile.txt > myfile.fixed.txt
Блокнот Windows будет правильно читать текст в кодировке UTF-8 и UTF-16.