Как раскодировать ответ HTTP-запроса с символами Unicode вида \uXXXX в 1С?

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

При отправке HTTP-запросов из 1С к сторонним веб-сервисам (например, через COM-объект WinHttp.WinHttpRequest.5.1 или встроенные механизмы) разработчики часто сталкиваются с ситуацией, когда вместо привычного кириллического текста возвращается строка вида \u041d\u0435\u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435. Разберем по шагам, почему возникает эта проблема и как корректно преобразовать такие данные в читаемый русский текст.

Выясним причину возникновения символов вида \uXXXX

Последовательность символов формата \uXXXX (где XXXX — шестнадцатеричный код символа Unicode) называется Unicode Escape. Это стандартный способ экранирования спецсимволов и национальных алфавитов (включая кириллицу) в формате JSON и языках программирования вроде JavaScript.

Установка заголовков HTTP-запроса (таких как Accept-Charset или Content-Type) определяет кодировку передачи байтового потока по сети, но не заставляет веб-сервер менять алгоритм экранирования внутри текста ответа. Если веб-сервис сериализует ответ в JSON с экранированием не-ASCII символов, он вернет именно эти последовательности.

Попытка применить системную функцию РаскодироватьСтроку со способом СпособКодированияСтроки.КодировкаURL в данном случае не даст результата, так как эта функция предназначена исключительно для URL-кодированных строк с символом процента (формат %XX).

Вариант 1. Декодирование через объект ЧтениеJSON (Рекомендуемый способ)

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

Рассмотрим пример обработки текста ответа с помощью объекта ЧтениеJSON:


// Создаем объект для чтения JSON
ЧтениеJSON = Новый ЧтениеJSON;

// Загружаем полученную строку ответа
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);

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

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

Если сервер вернул не цельный JSON-документ, а отдельную экранированную строку, ее можно обернуть в кавычки перед передачей в ЧтениеJSON, чтобы платформа распознала ее как строковый элемент JSON:


ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку("""" + ТекстОтвета + """");

// Платформа автоматически декодирует все последовательности \uXXXX
СтрокаРаскодированная = ПрочитатьJSON(ЧтениеJSON);

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

Вариант 2. Переход на кроссплатформенные объекты HTTPСоединение и HTTPЗапрос

Использование COM-объекта WinHttp.WinHttpRequest.5.1 привязывает решение к операционной системе Windows и может вызывать проблемы с автоматической сменной кодировок. Для обеспечения стабильной и кроссплатформенной работы рекомендуется использовать встроенные объекты 1С: HTTPСоединение и HTTPЗапрос.

Проанализируем пример отправки GET-запроса через штатный механизм 1С:


// Настраиваем соединение
Соединение = Новый HTTPСоединение("site.com", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL);

// Формируем HTTP-запрос
Запрос = Новый HTTPЗапрос("/api/get_data");
Запрос.Заголовки.Вставить("Accept-Language", "ru");

// Отправляем запрос и получаем ответ
Ответ = Соединение.Получить(Запрос);

// Получаем тело ответа в виде строки с явным указанием UTF-8
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);

Вариант 3. Пользовательская функция раскодирования Unicode Escape

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

Рассмотрим алгоритм работы такой функции:

  1. Ищем вхождение подстроки \u в исходном тексте.
  2. Считываем следующие 4 шестнадцатеричных символа.
  3. Переводим шестнадцатеричный код в десятичное число.
  4. Заменяем последовательность \uXXXX результатом функции Символ(ДесятичныйКод).

Пример реализации алгоритма на языке 1С:


Функция РаскодироватьUnicodeEscape(Знач ИсходнаяСтрока) Экспорт

    Результат = ИсходнаяСтрока;
    Поз = Найти(Результат, "\u");

    Пока Поз > 0 Цикл
        
        // Извлекаем 4 шестнадцатеричных символа после \u
        HexКод = Сред(Результат, Поз + 2, 4);
        
        // Преобразуем HEX в десятичное число
        ЧисловойКод = 0;
        Для Сч = 1 По СтрДлина(HexКод) Цикл
            Симв = ВРег(Сред(HexКод, Сч, 1));
            ПозHex = Найти("0123456789ABCDEF", Симв);
            Если ПозHex > 0 Тогда
                ЧисловойКод = ЧисловойКод * 16 + (ПозHex - 1);
            КонецЕсли;
        КонецЦикла;
        
        // Заменяем \uXXXX на соответствующий символ
        Результат = СтрЗаменить(Результат, "\u" + HexКод, Символ(ЧисловойКод));
        
        Поз = Найти(Результат, "\u");
        
    КонецЦикла;

    Возврат Результат;

КонецФункции

Итоги

Строки вида \uXXXX — это нормальное представление символов Unicode в формате JSON, а не ошибка кодировки HTTP. Наиболее простым, надежным и производительным способом получения корректного текста в 1С является использование встроенного объекта ЧтениеJSON или перенос сетевого взаимодействия на штатные объекты HTTPСоединение и HTTPЗапрос.

← На главную