Узнать и изменить кодировку файла в mac
Инструкция7 мин 90 Обновлено 22 июля Сложность: Средняя
TL;DR
- file -I показывает charset, но кириллицу cp1251 определяет неточно – уточняйте через uchardet.
- Перекодировка: iconv -f WINDOWS-1251 -t UTF-8 old.php > new.php.
- Не перекодируйте файл сам в себя через > – оболочка обнулит его до чтения.
- BOM у UTF-8 ломает Битрикс (headers already sent) – его удаляют.
- Для одного-двух файлов проще Save with Encoding в VS Code.
«Кракозябры» вместо русского текста – почти всегда несовпадение кодировок: файл сохранён в Windows-1251, а сайт или редактор ждёт UTF-8 (или наоборот). На legacy-проектах, особенно на старом Битриксе в кодировке cp1251, это классическая беда. В macOS всё решается штатными средствами терминала – разберём, как узнать текущую кодировку, корректно её сменить, не потерять данные и когда удобнее сделать это прямо в редакторе.
Как узнать кодировку файла
Базовая команда – file. Ключ -I (заглавная i) на macOS выводит MIME-тип и charset, что нагляднее короткого -b:
file -I index.php
# index.php: text/x-php; charset=utf-8
file -I old.php
# old.php: text/plain; charset=iso-8859-1
Важно понимать ограничение: file различает кодировки эвристически и не всегда точен. Кириллицу в Windows-1251 он часто показывает как iso-8859-1 или unknown-8bit – это нормально, так как байты совпадают, а «русскую» раскладку определить по содержимому нельзя однозначно. Для более уверенного определения ставят отдельную утилиту через Homebrew:
brew install uchardet
uchardet old.php
# WINDOWS-1251
Ещё один надёжный признак – наличие BOM (маркера порядка байтов) у UTF-8. Его видно так:
head -c 3 file.php | xxd
# 00000000: efbb bf ... ← это BOM UTF-8Как сменить кодировку через iconv
Основной инструмент – iconv. Синтаксис: -f исходная кодировка, -t целевая. В отличие от старого совета с ключом -o, надёжнее перенаправлять вывод в новый файл – так виднее результат и меньше риск затереть оригинал:
iconv -f WINDOWS-1251 -t UTF-8 old.php > old.utf8.php
Никогда не перекодируйте файл «сам в себя» вот так – iconv ... old.php > old.php: оболочка обнулит файл до того, как iconv его прочитает, и вы потеряете содержимое. Всегда пишите в новый файл, проверяйте его и только потом заменяйте оригинал.
Посмотреть список всех поддерживаемых кодировок:
iconv -l
Массовая перекодировка каталога
Для проекта целиком удобно пройтись по всем PHP-файлам. Обязательно делайте это на копии или под git, чтобы можно было откатиться:
find . -name "*.php" -type f | while read f; do
iconv -f WINDOWS-1251 -t UTF-8 "$f" > "$f.tmp" && mv "$f.tmp" "$f"
done
Удаление и добавление BOM
Битрикс и многие PHP-приложения не любят BOM – он выводится в браузер как невидимые символы и ломает заголовки (headers already sent). Убрать BOM у UTF-8-файла:
sed -i '' '1s/^\xEF\xBB\xBF//' file.phpСпособ без терминала – через VS Code
Если правите один-два файла, удобнее визуальный путь в Visual Studio Code:
- внизу справа в статус-баре показана текущая кодировка (например,
UTF-8илиWindows 1251); - клик по ней → Reopen with Encoding – открыть файл в правильной кодировке, если текст отображается неверно;
- затем клик по кодировке → Save with Encoding → выбрать
UTF-8– пересохранить в нужной кодировке; - отдельно есть вариант UTF-8 with BOM – для веба выбирайте обычный
UTF-8без BOM.
Типичные ошибки
- Перекодировали уже UTF-8 как Windows-1251. Двойная перекодировка окончательно портит текст. Сначала точно определите исходную кодировку (uchardet), потом конвертируйте.
- Забыли про BOM. Файл в UTF-8, но с BOM – на Битриксе это причина сбитой вёрстки и ошибок с заголовками.
- Смешанная кодировка в проекте. Часть файлов в UTF-8, часть в cp1251 – база данных и настройка сайта должны соответствовать общей кодировке.
- Правка «в себя» через
>. Теряется содержимое файла – всегда через временный файл.
Кодировка тесно связана с настройками PHP при установке – если сайт на Битриксе выдаёт кракозябры сразу после развёртывания, посмотрите гайд «Решение проблем при установке Битрикс на timeweb», где разбираются default_charset и mbstring. Пригодятся и заметки по выводу данных: «Как вывести определённое поле элемента инфоблока».
Частые вопросы
Почему file показывает iso-8859-1 вместо Windows-1251?
Команда file определяет кодировку эвристически по байтам, а cp1251 и iso-8859-1 занимают один диапазон однобайтовых значений. Различить русскую раскладку по содержимому невозможно однозначно, поэтому для точности используйте uchardet.
Как перекодировать файл из Windows-1251 в UTF-8 в macOS?
Командой iconv -f WINDOWS-1251 -t UTF-8 old.php > old.utf8.php. Всегда пишите результат в новый файл, проверяйте его и только потом заменяйте оригинал.
Можно ли перекодировать файл сам в себя одной командой?
Нет. Конструкция iconv ... file > file обнулит файл до того, как iconv успеет его прочитать, и содержимое потеряется. Используйте временный файл и mv.
Что такое BOM и зачем его удалять?
BOM – трёхбайтовый маркер в начале UTF-8-файла (EF BB BF). Битрикс и PHP выводят его как невидимые символы, из-за чего ломается вёрстка и появляется ошибка headers already sent. Для веба используют UTF-8 без BOM.
Как сменить кодировку без терминала?
В VS Code кликните по индикатору кодировки в статус-баре, при необходимости Reopen with Encoding для правильного отображения, затем Save with Encoding и выберите UTF-8 без BOM.
Материалы по теме
Что почитать дальше по этой теме