Перейти к содержанию

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

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

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.

Материалы по теме

Что почитать дальше по этой теме

Инструкция Решение проблем при установке Битрикс на timeweb Установка 1С-Битрикс на shared-хостинг спотыкается о параметры PHP: mbstring, max_input_vars, отображение ошибок. Разбираем актуальные для PHP 8.x требования и способы их поправить – через .user.ini, .htaccess или панель хостинга. 8 мин 52 18 мая 2017 Инструкция Как вывести определённое поле элемента инфоблока в Битриксе Как в шаблоне компонента 1С-Битрикс вывести одно конкретное поле элемента инфоблока – например счётчик показов SHOW_COUNTER. Разбираем массив FIELDS, служебные поля элемента и безопасный вывод значения. 6 мин 51 18 февраля 2017 Инструкция Сменить формат даты в CMS «Битрикс» Как вывести поле «Начало активности» элемента инфоблока в формате «02 июня, 2016». Разбираем FormatDate с шаблоном «d F, Y», разбор строки через ParseDateTime и подводные камни с локалью и часовым поясом. 6 мин 50 18 мая 2017 Инструкция Вывод блоков только на определённых страницах сайта Как в 1С-Битрикс показать баннер, форму или блок только на нужных страницах. Разбираем API $APPLICATION->GetCurPage и GetCurDir, разницу между физическим и SEF-адресом, проверку по разделу и типичные ошибки с ЧПУ. 7 мин 58 24 октября 2018