![]() |
|
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) Заработало, спасибо!!!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |