«Кракозябры» вместо русского текста – почти всегда несовпадение кодировок: файл сохранён в 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. Пригодятся и заметки по выводу данных: «Как вывести определённое поле элемента инфоблока».