Перейти к содержанию
Инструкция

Узнать и изменить кодировку файла в mac

Как определить кодировку файла в macOS и перекодировать его в UTF-8: команды file и iconv в терминале, автоопределение через uchardet, удаление BOM и способ через VS Code. Разбираем частый случай Windows-1251 в проектах на Битриксе.

Обновлено 22 июля 7 минут чтения

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

Валентина Меланина

Хотите обсудить свой проект?

Помогу с разработкой, аналитикой и AI-видимостью вашего сайта

Если у вас есть задача — от внедрения разметки и аналитики до полной переработки сайта — напишите, обсудим объём и подход.