Подробный гайд: Как определить кодировку CSV-файла
Важно:
В CSV-файле кодировка не хранится как метаданные. Исключение — BOM в начале файла. Если BOM нет, кодировку можно определить только с большой вероятностью, а не на 100%.
Надёжный практический путь такой:
- Проверить BOM.
- Прогнать детекторы кодировок.
- Попробовать декодировать файл разными кодировками и посмотреть, где текст читается нормально.
- При необходимости — перекодировать.
1. Проверка BOM
BOM — это несколько байт в начале файла, которые явно указывают кодировку.
Linux / macOS / Git Bash / WSL
xxd -l 16 file.csv
# или
hexdump -C -n 16 file.csv
Windows PowerShell
Format-Hex -Path .\file.csv -Count 16
# если команда недоступна:
Format-Hex -Path .\file.csv | Select-Object -First 1
Таблица BOM
| Кодировка | Первые байты |
|---|---|
| UTF-8 с BOM | EF BB BF |
| UTF-16 LE | FF FE |
| UTF-16 BE | FE FF |
| UTF-32 LE | FF FE 00 00 |
| UTF-32 BE | 00 00 FE FF |
Если в начале файла нет этих байт, значит BOM нет. Дальше нужно определять эвристически.
2. Автоматические детекторы
Linux / macOS
# Встроенная утилита file
file --mime-encoding file.csv
# Linux:
file -i file.csv
# macOS:
file -I file.csv
Пример вывода:
file.csv: text/plain; charset=utf-8
Но для русских CSV file часто пишет iso-8859-1 или unknown-8bit, даже если внутри Windows-1251. Поэтому лучше использовать дополнительные утилиты.
# uchardet
sudo apt install uchardet # Ubuntu/Debian
brew install uchardet # macOS
uchardet file.csv
# enca — хорошо работает с русскими кодировками
sudo apt install enca
enca -L ru file.csv
# chardet из Python
pip install chardet
chardetect file.csv
Пример:
file.csv: windows-1251 with confidence 0.73
Если confidence меньше 0.7, результату лучше не доверять.
Python: charset-normalizer
pip install charset-normalizer
from charset_normalizer import from_path
result = from_path("file.csv").best()
print(result.encoding if result else "не определено")
3. GUI-редакторы
Notepad++
- Откройте CSV.
- Меню Encoding / Кодировки.
- Там будет текущая кодировка:
UTF-8,UTF-8-BOM,ANSI,UTF-16 LEи т.д. - Если текст «кракозябрами», попробуйте:
- Encoding → Character sets → Cyrillic → Windows-1251
- Encoding → Character sets → Cyrillic → OEM 866
- Encoding → UTF-8
- Чтобы именно перекодировать файл, используйте Convert to UTF-8 или Convert to UTF-8-BOM, а не просто Encode in UTF-8.
Важно:
В Notepad++ ANSI — это системная кодовая страница Windows. На русской Windows это обычно Windows-1251.
VS Code
- Откройте файл.
- В правом нижнем углу статус-бара будет кодировка:
UTF-8,UTF-8 with BOM,Windows-1251и т.п. - Кликните по ней.
- Выберите:
- Reopen with Encoding — переоткрыть с другой кодировкой.
- Save with Encoding — сохранить в другой кодировке.
- Можно включить автоопределение:
"files.autoGuessEncoding": true
Sublime Text / Kate
Обычно есть пункт меню File → Reopen with Encoding. Переключайте кодировки, пока текст не станет читаемым.
Excel
Excel не показывает кодировку напрямую.
Но можно понять её через импорт:
- Данные → Из текста/CSV.
- Выберите файл.
- В окне импорта укажите File Origin / Источник файла:
65001: Юникод (UTF-8)1251: Кириллица (Windows)866: Кириллица (DOS)
- Смотрите на предпросмотр.
Если при 1251 текст читается — скорее всего файл в Windows-1251. Если при 65001 — UTF-8.
LibreOffice
При открытии CSV LibreOffice показывает диалог импорта, где можно выбрать кодировку и сразу увидеть предпросмотр.
4. Самый надёжный способ: попробовать декодировать
Python
path = "file.csv"
encodings = [
"utf-8-sig", "utf-8",
"cp1251", "cp866",
"utf-16", "utf-16-le", "utf-16-be",
"iso-8859-1",
]
for enc in encodings:
try:
with open(path, encoding=enc) as f:
first = f.readline().strip()
print(f"{enc:12} OK {first[:120]}")
except Exception as e:
print(f"{enc:12} ERR {e}")
Смотрите, где текст читается нормально. Например:
- Привет — это UTF-8, прочитанный как Windows-1251.
- Ïðèâåò — это Windows-1251, прочитанный как ISO-8859-1.
- Привет — всё хорошо.
Важно:
iso-8859-1 умеет декодировать почти любые байты, поэтому сам факт успешного декодирования в iso-8859-1 ничего не доказывает.
Проверка структуры CSV
После выбора кодировки проверьте, что CSV разбирается правильно:
import csv
with open("file.csv", encoding="cp1251", newline="") as f:
reader = csv.reader(f)
print(next(reader))
Если колонки не поехали и текст читается — кодировка, скорее всего, верная.
Linux: iconv
iconv -f CP1251 -t UTF-8 file.csv | head
iconv -f UTF-8 -t UTF-8 file.csv | head
Если после iconv текст читается — исходная кодировка была указана верно.
5. Как интерпретировать результаты для русских CSV
| Что видно | Вероятная кодировка |
|---|---|
file пишет utf-8, русские буквы читаются |
UTF-8 |
file пишет iso-8859-1 или unknown-8bit, enca -L ru пишет CP1251 |
Windows-1251 |
enca пишет IBM866 |
CP866 / DOS |
В hex-коде много 00 между символами |
UTF-16 |
| Только латиница, цифры, знаки | ASCII-совместимая кодировка; для русского текста не определить |
uchardet пишет windows-1251 |
Проверьте чтением, но часто верно |
Для коротких CSV, файлов из одних цифр или файлов с одной строкой детекторы часто ошибаются.
6. Как перекодировать CSV, если кодировка найдена
Linux / macOS / Git Bash
iconv -f CP1251 -t UTF-8 file.csv > file_utf8.csv
iconv -f CP866 -t UTF-8 file.csv > file_utf8.csv
Добавить BOM для Excel:
printf '\xEF\xBB\xBF' > file_utf8_bom.csv
cat file_utf8.csv >> file_utf8_bom.csv
Python
text = open("file.csv", encoding="cp1251").read()
# UTF-8 без BOM
open("file_utf8.csv", "w", encoding="utf-8", newline="").write(text)
# UTF-8 с BOM — лучше для Excel
open("file_utf8_bom.csv", "w", encoding="utf-8-sig", newline="").write(text)
7. Частые ошибки
- Доверять только
file. Для кириллицы он часто показываетiso-8859-1. - Открывать CSV в Excel двойным кликом. Excel сам угадывает кодировку и может испортить отображение.
- Путать
Encode inиConvert toв Notepad++. Для смены кодировки файла нуженConvert to. - Считать, что BOM обязателен. UTF-8 без BOM — нормальный вариант.
- Верить детектору при коротком файле. Нужен достаточный объём текста.
- Загружать конфиденциальные CSV в онлайн-детекторы. Лучше использовать локальные инструменты.
Чек-лист
- Посмотрите первые байты:
xxd,hexdumpилиFormat-Hex. - Если BOM есть — кодировка известна.
- Если BOM нет — запустите
uchardet,enca -L ru,chardetect. - Откройте файл в VS Code или Notepad++ и попереключайте кодировки.
- Проверьте чтением через Python или
iconv. - Перекодируйте в нужную кодировку. Для Excel обычно удобнее UTF-8 с BOM.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.