Кодировка CSV и загадочный BOM
Excel открывает UTF-8 без BOM как windows-1251 — и получается «РОССИЯ». Это не ошибка Excel и не ошибка файла: в CSV просто негде написать, в какой он кодировке.
В CSV нет места для кодировки
XML объявляет кодировку в прологе, JSON по стандарту всегда UTF-8, DBF хранит код в заголовке. В CSV нет ничего: это просто текст с запятыми. Читающая программа обязана угадать — или спросить.
Excel не спрашивает: при двойном щелчке он берёт кодировку системы, то есть windows-1251 в русской Windows. Всё, что не в ней, превращается в кашу.
Что такое BOM и почему он выручает
BOM (byte order mark) — три служебных байта EF BB BF в начале файла. Формально они означают «здесь UTF-8», и Excel их понимает: файл с BOM открывается правильно даже двойным щелчком.
Обратная сторона: эти байты видны всем остальным. Программа, которая про BOM не знает, прочитает первое имя колонки как Код — с невидимым символом в начале, из-за которого не сойдётся сопоставление полей. Классическая причина загадочного «колонка Код не найдена».
Поэтому правило простое: BOM — если файл предназначен человеку с Excel; без BOM — если файл предназначен программе.
Как определить кодировку по содержимому
UTF-8 узнаётся структурно: в нём старшие байты идут строго определёнными последовательностями. Если файл этому правилу соответствует и при этом содержит не-ASCII байты — это почти наверняка UTF-8.
Если структура не подходит, остаются однобайтовые варианты, и тут решает содержимое: текст декодируется каждым кандидатом, а победителем становится тот, где получается похожий на русскую речь текст — без псевдографики и без заглавных букв посреди слов.
Этот же механизм используется для DBF и описан подробнее в статье про кракозябры в DBF.
Разделитель: вторая половина той же проблемы
Стандарт говорит «запятая», а русский Excel по умолчанию ждёт точку с запятой — потому что запятая занята под десятичный разделитель. Отсюда файлы, которые открываются одним столбцом.
Определить разделитель можно надёжно: перебрать кандидатов и выбрать тот, при котором во всех строках получается одинаковое число полей. Важно считать с учётом кавычек — иначе адрес с точкой с запятой внутри развалит статистику.
Если уверенного ответа нет (например, строки действительно рваные), честнее сказать об этом и дать переключить вручную, чем молча показать неверную таблицу.
Как сохранять, чтобы не было проблем
- Для обмена между программами: UTF-8 без BOM, разделитель — запятая, перевод строки
\n. - Для человека с русским Excel: UTF-8 с BOM, разделитель — точка с запятой.
- Для старых учётных систем: windows-1251, точка с запятой. Проверьте, что все символы в неё влезают — тире и «ёлочки» часто не влезают.
В диалоге экспорта TablesViewer это три готовых сочетания, а не абстрактный список кодировок.
Частые вопросы
Почему после сохранения из Excel файл стал в windows-1251?
Excel сохраняет «CSV» в системной кодировке. Нужен UTF-8 — выбирайте «CSV UTF-8 (разделитель — запятая)» отдельным пунктом.
Можно ли убрать BOM?
Да, это просто первые три байта файла. Любой редактор с выбором кодировки позволяет пересохранить без него.
Что делать, если в файле смешаны кодировки?
Разделить файл на части по источникам и обработать отдельно: одной таблицей перекодировать такое нельзя.