Имя: Пароль:
1C
1С v8
1С + Yandex API + JSON с кириллицей = проблемы с кодировкой
0 Котокот
 
15.05.14
21:26
Подсоединяюсь из 1С к API Яндекс-директа. Все проходит гладко и красиво: и кампании создаются, и объявления и фразы, но только до тех пор, пока в наименованиях объявлений или в тексте фраз не появляются кириллические символы. Подозреваю, что дело в том, что 1С генерит строку в UTF-8, а сервер понимает только windows-1251. Код:

ССЛ = Новый ЗащищенноеСоединениеOpenSSL;
Заголовки = Новый Соответствие;
Заголовки["Content-Type"]     = "application/json; charset=" + ПараметрыСервера.КодировкаЗапроса; // Тут кодировка win-1251
Соединение = Новый HTTPСоединение(ПараметрыСервера.АдресСервера,,,,, Истина);
ИмяФайлаЗапроса       = ПолучитьИмяВременногоФайла();
ИмяФайлаРезультата = ПолучитьИмяВременногоФайла();
// Запись запроса в файл
ЗапросТекстовыйДокумент = Новый ТекстовыйДокумент;
ЗапросТекстовыйДокумент.УстановитьТекст(ЗапросJSON);
ЗапросТекстовыйДокумент.Записать(ИмяФайлаЗапроса, ПараметрыСервера.КодировкаЗапроса); // Тут кодировка тоже win-1251, другую API не принимает, сразу дает отлуп
// Соединение с сервером
Соединение.ОтправитьДляОбработки(ИмяФайлаЗапроса, ПараметрыСервера.АдресРесурса, ИмяФайлаРезультата, Заголовки);
Соединение = Неопределено;
// Чтение результата из файла
ЗапросТекстовыйДокумент = Новый ТекстовыйДокумент;
ЗапросТекстовыйДокумент.Прочитать(ИмяФайлаРезультата, ПараметрыСервера.КодировкаОтвета);
Результат.РезультатЗапроса = ЗаполнитьСтруктуруИзОтветаJSON(ОбработкаСлужебныхСимволовОтветаJSON(ЗапросТекстовыйДокумент.ПолучитьТекст()));


Пробовал записывать файл запроса под разными кодировками - не помогает. Пробовал прописывать разные кодировки в заголовке HTTP-соединения - не помогает. Сервер либо дает отлуп "Неверный формат JSON", либо такое сообщение:

Параметры запроса указаны неверно. Описание ошибки: In banner(0) В тексте рекламного сообщения можно использовать только буквы латинского, английского, турецкого, казахского, русского или украинского алфавита, кавычки, знаки '-', '+', '!', пробел. Ошибка в ключевой фразе '�����-�������'. Код ошибки: 71

Кириллические символы он на своей стороне принимает за ромбы. Пробовал перекодировать строку запроса так

Стр =ЗапросJSON;
Стрим = Новый COMОбъект("Adodb.Stream");
Стрим.Type = 2;
Стрим.Mode= 3;
Стрим.charset="utf-8";
Стрим.Open();
Стрим.WriteText(Стр);
Стрим.Position=0;
Стрим.charset="windows-1251";
Рез=Стрим.ReadText(-1);
Стрим.Close();    
ЗапросJSON = Рез;

и так:

  Симв=КодСимвола(Буква);
  if (Симв<128) Тогда
      Возврат буква
   ИначеЕсли (Симв>=1040 и Симв<=1103)Тогда
   Возврат Символ(Симв-1040+192)
ИначеЕсли Симв=КодСимвола("Ё") Тогда
     Возврат Символ(168);
ИначеЕсли Симв=КодСимвола("ё") Тогда
     Возврат Символ(184)
ИначеЕсли Симв=КодСимвола("№") Тогда
     Возврат Символ(185)


В отладчике видно, что кириллические символы заменяются на кракозябры, но и их сервер не ест, возвращает в сообщении об ошибке не ромбы, а "????????-??????".

ЧЯДНТ? Как скормить яндексу JSON-запрос с кириллицей?
1 zva
 
16.05.14
07:08
Да должен utf-8 понимать
2 zva
 
16.05.14
07:11
http://api.yandex.ru/direct/doc/concepts/JSON.xml
просто когда 1с генерит файл в кодировке utf-8, она в начало файла ВОМ символы записывает, из-за чего сервер считает, что json в неверном формате.
Можно так файл в кодировке utf-8 без BOM записать
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);
        ЗаписьТекста.Закрыть();
        ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла,,, Истина, Символы.ПС);
3 Котокот
 
16.05.14
09:09
(2) Уоу, сейчас попробуем!
4 XLife
 
16.05.14
09:22
5 Котокот
 
16.05.14
09:53
(2)(4) Заработало, спасибо!!!
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс