Перейти к содержимому
myconvert.ru

Кракозябры в текстовых файлах: причина и решение

Обновлено

Инструмент по теме статьи — работает прямо здесь, без загрузки файлов на сервер:

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 — этот формат хранит кодировку внутри себя, и вопрос не возникает вовсе.

Частые вопросы

Файл испорчен?
Почти наверняка нет. Байты в нём целы, неверно только их истолкование: программа читает текст не в той кодировке, в которой он записан. Стоит прочитать его правильно — и текст восстановится полностью.
Почему Excel открывает UTF-8 с кракозябрами?
Потому что при двойном щелчке по CSV Excel не анализирует содержимое, а использует системную кодировку. Помогает метка BOM — три служебных байта в начале файла, по которым Excel однозначно опознаёт UTF-8.
Как понять, какая кодировка у файла?
По содержимому: программа сравнивает варианты расшифровки и выбирает тот, где буквы распределены как в осмысленном тексте. Автоматика ошибается редко, и в основном на очень коротких файлах, где статистике не на чем работать.
Можно ли восстановить текст, который уже сохранили с кракозябрами?
Если файл пересохранили в UTF-8 уже после неправильного прочтения, исходные буквы заменены символами замены и потеряны безвозвратно. Поэтому важно чинить кодировку до того, как файл будет пересохранён.