При отправке 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 (где XXXX — шестнадцатеричный код символа Unicode) называется Unicode Escape. Это стандартный способ экранирования спецсимволов и национальных алфавитов (включая кириллицу) в формате JSON и языках программирования вроде JavaScript.
Установка заголовков HTTP-запроса (таких как Accept-Charset или Content-Type) определяет кодировку передачи байтового потока по сети, но не заставляет веб-сервер менять алгоритм экранирования внутри текста ответа. Если веб-сервис сериализует ответ в JSON с экранированием не-ASCII символов, он вернет именно эти последовательности.
Попытка применить системную функцию РаскодироватьСтроку со способом СпособКодированияСтроки.КодировкаURL в данном случае не даст результата, так как эта функция предназначена исключительно для URL-кодированных строк с символом процента (формат %XX).
Платформа 1С:Предприятие содержит встроенный механизм работы с JSON, который автоматически преобразует управляющие последовательности \uXXXX в нормальные символы. Если ответ от сервера представляет собой валидный JSON, проще всего распарсить его штатным образом.
Рассмотрим пример обработки текста ответа с помощью объекта ЧтениеJSON:
// Создаем объект для чтения JSON
ЧтениеJSON = Новый ЧтениеJSON;
// Загружаем полученную строку ответа
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
// Считываем данные в структуру или соответствие 1С
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Если сервер вернул не цельный JSON-документ, а отдельную экранированную строку, ее можно обернуть в кавычки перед передачей в ЧтениеJSON, чтобы платформа распознала ее как строковый элемент JSON:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку("""" + ТекстОтвета + """");
// Платформа автоматически декодирует все последовательности \uXXXX
СтрокаРаскодированная = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Использование 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);
Если по каким-то причинам невозможно использовать ЧтениеJSON, можно написать собственную функцию для поиска и замены всех вхождений \uXXXX на соответствующие символы с помощью функции Символ().
Рассмотрим алгоритм работы такой функции:
\u в исходном тексте.\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Запрос.