Как декодировать текст вида \u041f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0430 в 1С при работе с JSON

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При обмене данными с веб-сайтами или внешними API через формат JSON разработчики часто сталкиваются со строками, в которых кириллица выглядит как набор непонятных символов: \u041f\u043e\u0441\u0442.... На первый взгляд это может показаться ошибкой кодировки, но на самом деле это стандартный способ представления символов Unicode в текстовом формате. В этой статье мы подробно разберем, что это такое и как правильно преобразовать такие последовательности в читаемый русский текст в среде 1С.

Что такое Unicode Escape Sequence

Формат, который мы видим, называется Unicode Escape Sequence (экранированная последовательность Unicode). Согласно международному стандарту JSON (RFC 8259), любой символ может быть заменен последовательностью из шести символов: обратный слэш, буква u и четыре шестнадцатеричные цифры, представляющие код символа в таблице Unicode. Например, \u041f соответствует заглавной русской букве "П".

Это используется для того, чтобы гарантировать корректную передачу текста через системы, которые поддерживают только 7-битную кодировку ASCII. Таким образом, кириллица не "ломается" при прохождении через промежуточные узлы интернета.

Способ 1: Использование штатных средств платформы 1С (8.3.6 и выше)

Если вы используете современную версию платформы 1С:Предприятие 8.3, вам не нужно писать сложные алгоритмы парсинга. Платформа умеет обрабатывать такие последовательности автоматически при чтении JSON. Рассмотрим наиболее эффективный и быстрый способ декодирования.

Для этого мы воспользуемся объектами ЧтениеJSON и функцией ПрочитатьJSON. Проанализируем пример кода:


// Допустим, у нас есть строка в формате JSON с экранированной кириллицей
СтрокаJSON = "{""result"":[{""TITLE"":""\u041f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0430 \u0437\u0430\u044f\u0432\u043a\u0430""}]}";

// Инициализируем объект для чтения JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);

// Читаем данные в соответствие или структуру
Данные = ПрочитатьJSON(ЧтениеJSON);

// Получаем значение — платформа сама преобразует \u041f в букву "П"
ТекстЗаявки = Данные.result[0].TITLE;
Сообщить(ТекстЗаявки); // Результат: Поступила заявка

Важный нюанс: если вы получили строку не в формате JSON, а просто как отдельный фрагмент с \uXXXX, вы можете "обернуть" её в кавычки, чтобы превратить в валидный JSON-объект, и прочитать тем же способом. Это гораздо надежнее ручного перебора строки.

Способ 2: Декодирование на старых версиях платформы (ручной метод)

В случаях, когда использование ЧтениеJSON невозможно (например, на версии 8.2 или в старых конфигурациях на обычных формах), приходится прибегать к ручному разбору строки. Разберем логику работы такого алгоритма. Нам нужно найти каждое вхождение \u, взять следующие 4 цифры, преобразовать их из шестнадцатеричной системы в десятичную и получить символ с помощью встроенной функции Символ().

Посмотрим на пример функции, которая реализует подобное преобразование:


Функция ДекодироватьUnicodeСтроку(Знач ВхСтрока) Экспорт
    Результат = "";
    ТекущаяПозиция = 1;
    Пока ТекущаяПозиция <= СтрДлина(ВхСтрока) Цикл
        СимволУ = Сред(ВхСтрока, ТекущаяПозиция, 2);
        Если СимволУ = "\u" Тогда
            // Извлекаем код (4 символа после \u)
            КодHex = Сред(ВхСтрока, ТекущаяПозиция + 2, 4);
            // Преобразуем Hex в десятичное число (упрощенно)
            КодЧислом = 0;
            Для и = 1 По 4 Цикл
                Знак = Сред(КодHex, и, 1);
                ПозицияВНаборе = Найти("0123456789abcdef", НРег(Знак)) - 1;
                КодЧислом = КодЧислом + ПозицияВНаборе * Pow(16, 4 - и);
            КонецЦикла;
            Результат = Результат + Символ(КодЧислом);
            ТекущаяПозиция = ТекущаяПозиция + 6;
        Иначе
            Результат = Результат + Сред(ВхСтрока, ТекущаяПозиция, 1);
            ТекущаяПозиция = ТекущаяПозиция + 1;
        КонецЕсли;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Этот метод работает медленнее штатного, но он полностью автономен и не зависит от версии платформы.

Способ 3: Использование регулярных выражений (VBScript.RegExp)

Для более изящного решения можно задействовать объект VBScript.RegExp. Это позволяет быстро находить все последовательности \uXXXX в большом тексте и заменять их на нужные символы через функцию обратного вызова или циклическую замену. Выясним, как это реализовать:

  1. Создаем объект VBScript.RegExp через Новый COMОбъект.
  2. Задаем шаблон поиска: \\u([0-9a-fA-F]{4}).
  3. Перебираем все найденные совпадения и заменяем их на результат работы функции Символ().

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

Особенности работы с "суррогатными парами"

Проанализируем важный технический момент: символы, выходящие за пределы базовой плоскости (например, некоторые редкие иероглифы или современные эмодзи), кодируются в JSON не одной последовательностью \uXXXX, а двумя — так называемой суррогатной парой (например, \uD83D\uDE00 для смайлика).

Внимание! Простые самописные функции декодирования часто ломаются на таких парах, пытаясь преобразовать их по отдельности. Однако штатный объект ЧтениеJSON корректно распознает суррогатные пары и превращает их в один правильный символ. Именно поэтому использование встроенных средств 1С всегда является приоритетным.

Как настроить обратное преобразование (из кириллицы в \uXXXX)

Иногда задача стоит обратная: передать данные на сайт так, чтобы вся кириллица была экранирована. В 1С это управляется при записи JSON. При инициализации объекта ЗаписьJSON мы можем указать параметры кодирования:


ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(,,, ЭкранированиеСимволовJSON.СимволыВнеASCII);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
// При записи вся кириллица превратится в \uXXXX автоматически
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);

Использование параметра СимволыВнеASCII гарантирует максимальную совместимость вашего JSON-файла с любыми внешними системами.

Выводы и рекомендации

Подводя итог нашему разбору, можно выделить следующие правила работы с Unicode-кодировкой в 1С:

Рассмотренные нами инструменты позволяют эффективно решать задачи интеграции и обеспечивать корректное отображение данных в интерфейсе пользователя, превращая "непонятные коды" в привычный русский текст.

← На главную