Кракозябры в текстовых файлах: причина и решение
Обновлено
Инструмент по теме статьи — работает прямо здесь, без загрузки файлов на сервер:
TXTПерекодировать текст из windows-1251 в UTF-8
Вы открываете присланный файл, а вместо русского текста видите «Îò÷¸ò î ïðîäàæàõ» или «ÐžÑ‚Ñ‡Ñ‘Ñ‚». Выглядит как порча данных, но это не она.
Что на самом деле произошло
В текстовом файле хранятся числа — коды символов. Чтобы превратить их в буквы, нужна таблица соответствия, то есть кодировка. Беда в том, что форматы .txt и .csv не записывают внутри себя, какая таблица использовалась. Программа вынуждена угадывать.
Когда она угадывает неверно, каждый байт превращается не в ту букву. Данные при этом целы: достаточно прочитать их правильной таблицей, и текст восстановится до последнего символа.
Откуда берутся разные кодировки
Windows-1251 (её же называют ANSI) — основная однобайтовая кодировка кириллицы в русской Windows. Один символ занимает один байт, всего помещается 256 знаков. Большинство выгрузок из учётных систем и старых программ — именно в ней.
CP866 — наследие MS-DOS. До сих пор встречается в выгрузках из старых бухгалтерских программ.
KOI8-R — кодировка из мира UNIX, сегодня редкая.
UTF-8 — современный стандарт, где один символ занимает от одного до четырёх байт и помещаются символы всех письменностей мира. Латиница в нём занимает один байт, кириллица — два. Именно поэтому текст в UTF-8, прочитанный как windows-1251, даёт по два «иероглифа» на каждую русскую букву: «ÐžÑ‚чёт».
Как по виду кракозябр понять причину
Если каждая русская буква превратилась в два странных символа — файл в UTF-8, а читают его как однобайтовую кодировку.
Если русские буквы превратились в один символ каждая — латиницу с диакритикой, псевдографику, — файл в однобайтовой кодировке, а читают его как другую однобайтовую или как UTF-8.
Отдельная история с Excel
Excel при двойном щелчке по файлу .csv не анализирует содержимое: он использует системную кодировку. Поэтому корректный UTF-8 открывается кракозябрами, хотя с файлом всё в порядке.
Есть два решения. Первое — импортировать данные через «Данные → Получить данные → Из текстового/CSV-файла», где кодировка выбирается вручную. Второе, куда удобнее, — добавить в начало файла метку BOM: три служебных байта, по которым Excel однозначно опознаёт UTF-8 и открывает файл правильно двойным щелчком.
Как починить
Инструмент перекодирования определяет исходную кодировку по содержимому: он расшифровывает текст всеми кириллическими вариантами и сравнивает, в каком из них буквы встречаются с частотой, свойственной русскому языку. Правильная расшифровка даёт много «о», «е», «а» и «и»; неправильная — россыпь редких букв и псевдографики.
Определённая кодировка показывается в карточке файла, так что результат можно проверить. Если автоматика ошиблась — на очень коротких файлах это возможно, — кодировку можно задать вручную.
Результат записывается в UTF-8 с меткой BOM, то есть сразу пригодным для Excel.
Важное предупреждение
Чините кодировку до того, как файл будет пересохранён программой, прочитавшей его неправильно. Если редактор открыл текст с кракозябрами и вы нажали «Сохранить», неопознанные символы заменяются служебным знаком замены — и вот тогда данные теряются по-настоящему.
Как избежать проблемы в будущем
При выгрузке данных выбирайте UTF-8 с BOM, если такая опция есть. При отправке файлов коллегам предупреждайте о кодировке или используйте XLSX — этот формат хранит кодировку внутри себя, и вопрос не возникает вовсе.