PHP на сервере PHP 7.x/8.x на Linux; версия и веб-обработчик уточняются

PHP на сервере: При записи JSON кириллица сохраняется в виде escape-последовательностей

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

В JSON символы кириллицы могут записываться как последовательности вида \u041f — это допустимое представление Юникода, а не испорченный текст. Если нужен читаемый JSON, в PHP используется флаг JSON_UNESCAPED_UNICODE при условии корректной UTF-8-строки.

В этой статье
  1. Что происходит и как определить неисправность
  2. Вероятные причины и признаки
  3. Пошаговая диагностика и исправление
  4. Как проверить результат
  5. Если не помогло

#Что происходит и как определить неисправность

В JSON символы кириллицы могут записываться как последовательности вида \u041f — это допустимое представление Юникода, а не испорченный текст. Если нужен читаемый JSON, в PHP используется флаг JSON_UNESCAPED_UNICODE при условии корректной UTF-8-строки.

#Вероятные причины и признаки

Возможная причинаКак узнатьЧто делать
Обычное экранирование по умолчаниюОбычное экранирование по умолчанию. JSON содержит \uXXXX, но json_decode() возвращает правильную русскую строкуJSON содержит \uXXXX, но json_decode() возвращает правильную русскую строкуИспользовать JSON_UNESCAPED_UNICODE при формировании.
Исходная строка не в UTF-8Исходная строка не в UTF-8. json_encode() выдаёт false/исключение или повреждённую строкуjson_encode() выдаёт false/исключение или повреждённую строкуИсправить кодировку входных данных, а не отключать проверки.
Дополнительный сериализатор меняет результатДополнительный сериализатор меняет результат. Файл был записан корректно, но после экспорта появляется двойное экранированиеФайл был записан корректно, но после экспорта появляется двойное экранированиеПроверить этап записи и повторного преобразования JSON.

#Пошаговая диагностика и исправление

  1. Отличите экранирование от поврежденияОткройте JSON в текстовом редакторе с UTF-8. Если видите \u041f\u0440..., декодируйте небольшое тестовое значение стандартным JSON-парсером: если получается корректный русский текст, данные не утрачены. Если вместо букв видны «РџС...», это иная проблема перекодировки.
  1. Проверьте входные данныеУзнайте, в какой кодировке пришла строка из базы, HTTP-запроса или старого файла. Для JSON стандарт требует UTF-8; не применяйте mb_convert_encoding к уже правильно закодированным данным. Сверьте кодировку подключения к базе и исходного файла.
  1. Примените правильный параметр json_encodeНа тестовой копии в редакторе замените вызов json_encode($data) на вариант с JSON_UNESCAPED_UNICODE. При необходимости для удобства чтения добавьте JSON_PRETTY_PRINT, но помните: форматирование изменит размер файла.
  2. Пример кода по теме
    PHP
    Пример PHP 7.3+ на тестовой копии; записывает файл sample.json и требует разрешённый каталог.
    <?php
    $data = ["message" => "Привет"];
    $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
    file_put_contents(__DIR__ . "/sample.json", $json);
  1. Запишите исключения вместо молчаливого отказаЕсли приложение использует PHP 7.3+, оберните json_encode в try/catch (JsonException), записывая в закрытый журнал только техническое сообщение без содержимого персональных данных. На старых версиях проверяйте возвращаемое false через json_last_error_msg.
  1. Проверьте отсутствие двойной сериализацииОткройте итоговый файл и убедитесь, что его корневой тип соответствует ожидаемому объекту/массиву. Если весь JSON окружён кавычками и внутри много \" и \\, возможно, JSON-кодировали повторно как строку. Исправьте именно второй вызов, не выполняйте массовую замену обратных слешей.
  1. Сверьте HTTP-заголовок и файлЕсли JSON отдаётся по сети, проверьте Content-Type: application/json и правильную кодировку документа. Вручную не вставляйте непроверенную строку пользователя в JSON через конкатенацию: так можно нарушить синтаксис и экранирование управляющих символов.
  1. Прочитайте результат обратноНа тестовом файле выполните json_decode с JSON_THROW_ON_ERROR и сравните исходную строку с полученной. Для рабочего массива проверьте несколько русских букв, кавычки, перевод строки и эмодзи. После проверки удалите sample.json, если он не нужен.
  1. Не ломайте совместимость ради читаемостиЕсли существующий API ожидает стандартный JSON, менять способ экранирования необязательно: оба варианта допустимы. Зафиксируйте изменение для команды, обновите тесты и проверьте клиентов до публикации.

#Как проверить результат

После нового экспорта в тексте видны кириллические символы, json_decode успешно возвращает исходные значения, API и проверка схемы не изменились.

#Если не помогло

При ошибке UTF-8 проверьте кодировку источника; при двойных слешах — количество вызовов кодирования. Не заменяйте слеши регулярными выражениями во всём файле.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.