Как раскодировать строку с Unicode Escape последовательностями вида \uXXXX в 1С?

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

При интеграции 1С с внешними REST API, веб-сервисами и транспортными компаниями разработчики регулярно сталкиваются с ответами, в которых кириллические символы и специальные знаки представлены в виде экранированных последовательностей Unicode вида \u0410\u0431\u0430\u043a\u0430\u043d (что соответствует строке «Абакан»).

Разберем причины появления такого формата, а также рассмотрим простые и надежные способы преобразования подобных строк в обычный читаемый текст на платформе 1С:Предприятие.

Почему сервис возвращает строку в таком формате

Последовательность символов вида \uXXXX (где XXXX — шестнадцатеричный код символа в таблице Unicode) называется Unicode Escape Sequence. Это стандартный способ экранирования символов в форматах JSON и JavaScript. Он применяется для безопасной передачи текста вне базового набора ASCII через сетевые протоколы, исключая проблемы с несовпадением кодировок (например, Windows-1251, UTF-8 или ISO-8859-1) на стороне клиента и сервера.

Так как этот формат является частью стандарта JSON, для его раскодирования в 1С не требуется писать собственные сложные парсеры или вызывать внешние COM-скрипты. Достаточно воспользоваться штатным функционалом платформы для работы с JSON.

Способ 1. Однострочная десериализация через ПрочитатьJSON (рекомендуемый)

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

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


Функция РаскодироватьСтрокуЮникод(Знач ИсходнаяСтрока) Экспорт
    
    ЧтениеJSON = Новый ЧтениеJSON;
    // Оборачиваем строку в кавычки для создания валидного строкового литерала JSON
    ЧтениеJSON.УстановитьСтроку("""" + ИсходнаяСтрока + """");
    
    Результат = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Возврат Результат;
    
КонецФункции

Разберем по шагам, почему этот способ предпочтительнее ручного разбора:

  1. Корректная обработка всех спецсимволов: метод автоматически декодирует не только \uXXXX, но и стандартные экранированные управляющие конструкции JSON, такие как \n (перенос строки), \t (табуляция), \" (кавычка) и \\ (обратный слэш).
  2. Поддержка суррогатных пар: если в тексте встречаются символы за пределами базовой многоязыковой плоскости (BMP, с кодами выше U+FFFF, например, эмодзи или редкие символы), они передаются суррогатной парой вида \uD83D\uDE00. Штатный механизм ПрочитатьJSON корректно объединяет такую пару в один итоговый символ.
  3. Высокая производительность: десериализация выполняется на уровне платформенного C++ ядра без накладных расходов на циклы встроенного языка 1С.

Способ 2. Потоковое чтение через объект ЧтениеJSON

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

Посмотрим на пример кода:


ИсходнаяСтрока = "\u0410\u0431\u0430\u043a\u0430\u043d";

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

Пока ЧтениеJSON.Прочитать() Цикл
    Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда
        РаскодированныйТекст = ЧтениеJSON.ТекущееЗначение;
        Сообщить("Результат: " + РаскодированныйТекст);
    КонецЕсли;
КонецЦикла;

ЧтениеJSON.Закрыть();

Важные ограничения и нюансы

При использовании данных методов необходимо учитывать следующие технические особенности платформы 1С:

  1. Версия платформы 1С:Предприятие: встроенные объекты ЧтениеJSON, ЗаписьJSON и функция ПрочитатьJSON доступны начиная с версии платформы 8.3.6. На более старых версиях (8.2 или ранних 8.3) этот функционал отсутствует.
  2. Кроссплатформенность: использование стандартных объектов JSON полностью кроссплатформенно и одинаково стабильно работает на серверах под управлением Windows и Linux. В отличие от них, альтернативные решения на базе COM-объектов (таких как MSScriptControl.ScriptControl или htmlfile) не могут работать в среде Linux и на 64-разрядных серверах без специализированных оберток.
  3. Экранирование внутри строк: если во входной строке уже содержатся незаэкранированные двойные кавычки, перед оборачиванием строки в кавычки для ПрочитатьJSON их необходимо дополнительно экранировать (заменять символ " на \").
← На главную