Имя: Пароль:
1C
1C 7.7
v7: Сохранение результата запроса в utf-8
0 Snork
 
03.05.18
17:31
Получаю данные с сайта через WinHttp.WinHttpRequest.5.1
Сайт умеет отдавать только в utf-8.

Как можно это дело сохранить в файл в utf-8?

Пробовал:
Stream = CreateObject("Adodb.Stream");
Stream.Charset="utf-8";
Stream.Type = 2;
Stream.Mode = 3;
Stream.Open();
Stream.WriteText("<?xml version=""1.0"" encoding=""utf-8""?>");
Stream.WriteText(WinHttp.ResponseText());
Stream.SaveToFile("d:\1.xml", 2);

не помогло. А объект "Текст" в 7.7 не умеет с utf-8.

Это вообще возможно?
1 Масянька
 
03.05.18
17:34
2 g00d
 
03.05.18
17:34
3 Масянька
 
03.05.18
17:35
+ (1) С такой полоской - пора бы уже научиться гуглить...
4 Slypower
 
03.05.18
18:37
Функция ПреобразоватьСтрокуВУТФ8(Стр)
    Длина=СтрДлина(Стр);
    Итог="";
    Для Н=1 По Длина Цикл
        Знак=Сред(Стр,Н,1);
        Код=КодСимв(Знак);
        Если Код<128 Тогда
            Итог=Итог+Знак;
        Иначе
            Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
                Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
            ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
                Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
            ИначеЕсли (Знак="ё") Тогда
                Итог=Итог+Симв(209)+Симв(145);
            ИначеЕсли (Знак="Ё") Тогда
                Итог=Итог+Симв(208)+Симв(129);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции  

Процедура ПерекодировкаФайлаWin_UTF8(ИмяФайлаWin,ИмяФайлаUTF8)
    ТекстWin=СоздатьОбъект("Текст");
    ТекстUTF8=СоздатьОбъект("Текст");
    ТекстWin.Открыть(ИмяФайлаWin);
    Для к=1  По ТекстWin.КоличествоСтрок() Цикл  
        СтрWin=ТекстWin.ПолучитьСтроку(к);    
        СтрUTF8=ПреобразоватьСтрокуВУТФ8(СтрWin);
        ТекстUTF8.ДобавитьСтроку(СтрUTF8);
    КонецЦикла;                          
    ТекстUTF8.Записать(ИмяФайлаUTF8);
КонецПроцедуры    // ПерекодировкаФайлаWin_UTF8
5 Snork
 
03.05.18
18:46
Тут в другом проблема
WinHttp.ResponseText()
возвращает уже в кодировке utf-8

А 7.7 ее не поддерживает, это уже абра-кадабра

Надо это как то записать в читаемом виде в файл.

Что-то похожее описано в:
https://www.forum.mista.ru/topic.php?id=529295
6 Snork
 
03.05.18
18:47
(1) - это не то. проблема в другом
7 Snork
 
03.05.18
18:48
(2) - не то, текст еще не записан, но уже пришел не в той кодировке. его так не преобразовать.
8 Злопчинский
 
03.05.18
19:17
(5) При чем здесь 77? пришла строка в утф, вдобавок ты получаешь ответ не77методами, а внешними компонентами. ну так используй любые внешние нужные возможности для запихивание строки в не77текстовый файл.
9 ugorchina
 
03.05.18
19:33
Как по моему не правильно написано надо вроде так но я могу ошибаться
Stream = CreateObject("Adodb.Stream");
Stream.Charset="utf8";
Stream.Type = 2;
Stream.Mode = 3;
Stream.Open();
Stream.WriteText("<?xml version=""1.0"" encoding=""utf8""?>");
Stream.WriteText(WinHttp.ResponseText());
Stream.SaveToFile("d:\1.xml", 2);
10 ugorchina
 
03.05.18
19:34
Если сайт отдает в utf8 то зачем кодировать по-новой?
11 ugorchina
 
03.05.18
19:35
Дайте полный код без логина и пароля я посмотрю
12 ugorchina
 
03.05.18
19:40
Я бы дал ссыль на свои статьи да боюсь забанят меня ( на самом деле если сайт возвращает в utf8 то все должно быть ок но видимо у Вас с калибровкой на сайте что то не то( посмотрите в базе в таблицах какая калибровка установлена ? А так же в конфигурации файле сайта там то же должна быть кодировка
13 ugorchina
 
03.05.18
19:41
У меня сайт возвращает в utf 8 и в 7 ее все читаемо
14 Сияющий в темноте
 
03.05.18
19:42
winhttprequest должен читать кодировку и переводить ее в двухбайтовую,если вы не берете из него байтовый поток который есть массив байт,и 1с ничего не умеет делать с массивом байт,его нужно отдавать тому же AdoDb.Stream или сценарию на VbScript,где собирать из него строку,нормальную двухбайтовую,которую передавать в 1с,где из нее будет сделана однобайтовая с потерей символов,и вот с ней вы уже будете работать
все просто,если внимательно читать описания обьектов и другую справочную информацию
15 ugorchina
 
03.05.18
19:47
(14) )) Вы на полочку опираетесь?))))
16 ugorchina
 
03.05.18
19:47
))) полоску
17 ugorchina
 
03.05.18
19:56
WinHttp.ResponseText() посмотрите что здесь результат в студию
18 ugorchina
 
03.05.18
19:57
стучитесь  в аську 722576410
19 big
 
04.05.18
05:04
Сохранить utf8 средствами 1С 7.7

Вариант 1.
Функция ИсправлениеКодировки(Стр)
    
    Длина=СтрДлина(Стр);
    Итог="";
    Для Н=1 По Длина Цикл
        Знак    = Сред(Стр,Н,1);
        Код        = КодСимв(Знак);
        Если Код<128 Тогда
            Итог    = Итог+Знак;
        Иначе
            Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
                Итог    = Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
            ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
                Итог    = Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
            ИначеЕсли (Знак="ё") Тогда
                Итог    = Итог+Симв(209)+Симв(145);
            ИначеЕсли (Знак="Ё") Тогда
                Итог    = Итог+Симв(208)+Симв(129);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Итог;
КонецФункции

Вариант 2.
    WinHttp.SetCredentials(СокрЛП(Login),СокрЛП(Password),0);
WinHttp.setRequestHeader("Content-Type","text/xml;charset=UTF-8");
WinHttp.SetRequestHeader("Content-Length", Строка(СтрДлина(ТекстДляОтправки)));
WinHttp.Send(ТекстДляОтправки);

ОтветСервиса=WinHttp.ResponseText();

DOMDocument    = СоздатьОбъект("MSXML2.DOMDocument");
DOMDocument.loadXML(ОтветСервиса);
DOMDocument.save(ИмяФайла);
20 Snork
 
04.05.18
10:10
(17) Не весь, но до места, где уже качественно видно другую кодировку:
<response><metadata>
  <counteragents_updated_at>None</counteragents_updated_at>
  <current_page>1</current_page>
  <generated_at>2018-05-04 10:09:30.099227</generated_at>
  <next_page>None</next_page>
  <prev_page>None</prev_page>
  <total_pages>1</tota_pages>
</metadata>
<orders>
  <air></air>
  <arrival>
    <address>249030, ???°?»N??¶N????°N? ???±?», ???±??????N??? ??, ???°N???N??° ??N?-??N?, ?????? a?? 50</address>
    <address_code>4000000200000710000000000</address_code>
    <city>???±??????N???
21 Snork
 
04.05.18
10:14
(19)
ИсправлениеКодировки() - не помогло, т.к. уже приходит абра-кадабра

MSXML2.DOMDocument - тоже не помогло
22 Snork
 
04.05.18
11:13
ап
23 Slypower
 
04.05.18
11:36
В РБ есть ЭСЧФ. Так это получение xml файлов из интернета и обработка их. Выставляют в разных кодировках, абсолютно.
Для обработки я использую схему: сохранить файл, перекодировать как в (4), а затем уже с помощью Scripting.FileSystemObject читаю. Никаких проблем нет
24 Snork
 
04.05.18
11:46
РЕШЕНО. Надо было читать НЕ из 1С
25 Snork
 
04.05.18
11:48
Stream = СоздатьОбъект("ADODB.Stream");
Stream.Mode = 3;
Stream.Type = 1;
Stream.Open();
        
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language = "javascript";
        
Скрипт.AddObject("WinHttp", WinHttp);
Скрипт.AddObject("Стрим",   Stream);
        Скрипт.Eval("Stream.Write(WinHttp.ResponseBody)");
        
Stream.SaveToFile(КаталогВременныхФайлов() + "5.xml", 2);
Stream.Close();
26 ugorchina
 
04.05.18
14:29
а я вот не смог помочь ( печаль (