Подробный гайд: Как определить кодировку CSV-файла

Пошаговый гайд: как определить кодировку CSV-файла через BOM, file, uchardet, Python, Notepad++ и VS Code, а затем перекодировать в UTF-8.

2026.09.19                  


Подробный гайд: Как определить кодировку CSV-файлаПодробный гайд: Как определить кодировку CSV-файла

Важно:

В CSV-файле кодировка не хранится как метаданные. Исключение — BOM в начале файла. Если BOM нет, кодировку можно определить только с большой вероятностью, а не на 100%.


Надёжный практический путь такой:

  1. Проверить BOM.
  2. Прогнать детекторы кодировок.
  3. Попробовать декодировать файл разными кодировками и посмотреть, где текст читается нормально.
  4. При необходимости — перекодировать.

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++

  1. Откройте CSV.
  2. Меню Encoding / Кодировки.
  3. Там будет текущая кодировка: UTF-8, UTF-8-BOM, ANSI, UTF-16 LE и т.д.
  4. Если текст «кракозябрами», попробуйте:
    • Encoding → Character sets → Cyrillic → Windows-1251
    • Encoding → Character sets → Cyrillic → OEM 866
    • Encoding → UTF-8
  5. Чтобы именно перекодировать файл, используйте Convert to UTF-8 или Convert to UTF-8-BOM, а не просто Encode in UTF-8.

Важно:

В Notepad++ ANSI — это системная кодовая страница Windows. На русской Windows это обычно Windows-1251.


VS Code

  1. Откройте файл.
  2. В правом нижнем углу статус-бара будет кодировка: UTF-8, UTF-8 with BOM, Windows-1251 и т.п.
  3. Кликните по ней.
  4. Выберите:
    • Reopen with Encoding — переоткрыть с другой кодировкой.
    • Save with Encoding — сохранить в другой кодировке.
  5. Можно включить автоопределение:
"files.autoGuessEncoding": true

Sublime Text / Kate

Обычно есть пункт меню File → Reopen with Encoding. Переключайте кодировки, пока текст не станет читаемым.

Excel

Excel не показывает кодировку напрямую.

Но можно понять её через импорт:

  1. Данные → Из текста/CSV.
  2. Выберите файл.
  3. В окне импорта укажите File Origin / Источник файла:
    • 65001: Юникод (UTF-8)
    • 1251: Кириллица (Windows)
    • 866: Кириллица (DOS)
  4. Смотрите на предпросмотр.

Если при 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. Частые ошибки

  1. Доверять только file. Для кириллицы он часто показывает iso-8859-1.
  2. Открывать CSV в Excel двойным кликом. Excel сам угадывает кодировку и может испортить отображение.
  3. Путать Encode in и Convert to в Notepad++. Для смены кодировки файла нужен Convert to.
  4. Считать, что BOM обязателен. UTF-8 без BOM — нормальный вариант.
  5. Верить детектору при коротком файле. Нужен достаточный объём текста.
  6. Загружать конфиденциальные CSV в онлайн-детекторы. Лучше использовать локальные инструменты.

Чек-лист

  1. Посмотрите первые байты: xxd, hexdump или Format-Hex.
  2. Если BOM есть — кодировка известна.
  3. Если BOM нет — запустите uchardet, enca -L ru, chardetect.
  4. Откройте файл в VS Code или Notepad++ и попереключайте кодировки.
  5. Проверьте чтением через Python или iconv.
  6. Перекодируйте в нужную кодировку. Для Excel обычно удобнее UTF-8 с BOM.

Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта