Перейти к основному содержимому
CSV First Aid

Что такое CSV BOM и почему он всё ломает?

BOM (Byte Order Mark) — это 3 невидимых байта в начале файла, создающих непропорционально много боли. Это руководство объясняет, что это, зачем существует и как от него избавиться.

Что такое BOM?

BOM значит Byte Order Mark. Для UTF-8 это последовательность байтов EF BB BF (U+FEFF). Придуман для сигнализирования кодировки текстового файла — читатель видит эти байты и знает, что файл UTF-8.

Для UTF-16 и UTF-32 BOM существенен, потому что эти кодировки могут быть big-endian или little-endian. Для UTF-8 он не нужен, потому что UTF-8 не имеет проблемы с порядком байтов. Стандарт Unicode прямо говорит, что BOM 'ни обязателен, ни рекомендуется' для UTF-8.


Почему Excel его добавляет?

Когда делаете 'Сохранить как → CSV UTF-8' в Excel — он добавляет BOM, чтобы сам же Excel мог определить кодировку при повторном открытии. Microsoft-центричное решение, отлично работающее внутри экосистемы Excel и ломающее всё остальное.


Что ломается?

Модуль csv в Python: первый заголовок становится '\ufeffid' вместо 'id'. Ключи DictReader не матчатся. Pandas: первая колонка называется '\ufeffcolumn_name'. SQL BULK INSERT: отвергает файл или помещает BOM в данные первой строки. JSON-парсеры: падают, если BOM предшествует JSON. Shell-тулы: grep, awk, cut видят BOM как часть первого поля.


Как убрать

Python: open('file.csv', encoding='utf-8-sig') — суффикс 'sig' говорит Python убрать BOM. В Node.js: buffer.toString('utf8').replace(/^\uFEFF/, ''). В Bash: sed -i '1s/^\xEF\xBB\xBF//' file.csv. Или просто бросить файл в CSV First Aid — один клик.


Стоит ли когда-нибудь добавлять BOM?

Только если ваш единственный потребитель — Excel. Если файл обрабатывает любой другой тул (Python, БД, API, shell-скрипты) — опустите BOM. CSV First Aid позволяет добавить BOM при экспорте для совместимости с Excel, но только когда явно выберете.

Не хочется лезть в hex-редакторы? CSV First Aid находит и убирает BOM за вас.

Почините CSV сейчас →

Похожие инструменты