:: Visual Foxpro, Foxpro for DOS
UTF8 -> WIN1251
ВалШебНик
Автор

Сообщений: 10
Откуда: Ставрополь
Дата регистрации: 29.01.2009
Доброго дня!
Сломал голову как почесть русские символы: Делаю запрос к сервису SOAP


oHTTPS = NEWOBJECT("MSXML2.XMLHTTP")
oHTTPS.Open("POST","https://socpwebservice.XXXXX.ru/service1.asmx",.f.)
oHTTPS.SetRequestHeader("Content-Type","text/xml; charset=utf-8")
oHTTPS.Send("<?xml version="1.0" encoding="utf-8"?>")

cResponseTxt = oHTTPS.ResponseBody

Получаю ответ:

<?xml version="1.0" encoding="utf-8"?>
<soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xsd="http://www.w3.org/2001/xmlschema">
<soap:body>
<socp_send_paymentresponse xmlns="http://socpwebservice.voz.ru/">
<socp_send_paymentresult>0</socp_send_paymentresult>
<ext_response />
<str_error>&#945;?&#223;?&#945;±&#945;+&#945;&#8804;&#945;° &#223;?&#945;?&#223;:&#223;?&#945;°&#945;?&#945;&#964;&#945;?&#945;±&#223;? &#945;&#8993;&#945;>&#945;°&#223;'&#945;&#964;&#945;&#945;° &#945;? &#945;&#9474;&#945;?&#945;?: - (&#945;&#8993;&#945;>&#945;°&#223;'&#945;&#964;&#945; &#945;?&#945;&#964; &#945;?&#945;°&#945;&#8319;&#945;?&#945;&#964;&#945;?)</str_error>
<n_maket_out></n_maket_out>
<d_maket_out />
</socp_send_paymentresponse>
</soap:body>
</soap:envelope>


Вот эту сроку <str_error> прочесть ну никак.
Перебрал варианты с strconv, не помогло никак.
Дорогие френды, может у кого-нибудь мелькнет идея

Я отдельно ее загонял в сторонние программки декодирования, получается, но какая то часть узнаваемых слов, часть ерунда какая-то...
Спасибо!
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Положите ответ сервиса в файлик и полученный файлик приложите к сообщению. Это для сохранения кодировки текста.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
ВалШебНик
Автор

Сообщений: 10
Откуда: Ставрополь
Дата регистрации: 29.01.2009
Вот файл ответа сервиса
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
-



Исправлено 1 раз(а). Последнее : Taran, 20.08.11 16:30
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Напишите авторам сервиса, что они выдают неверные ответы. Это вообще НЕКОРРЕКТНЫЕ UTF8 коды. Судя по всему, они где-то напутали, и вместо кириллических символов, которые в UTF8 выглядят как сочетания байт (в шестнадцатеричном виде) D0/D1/D2/D3+8x/9x/Ax/Bx напихали чушь в виде сочетаний байт F0/F1/F2/F3+8x/9x/Ax/Bx.
Помимо этого, они ещё похоже где-то ДО того провернули двойную конвертацию русских кодировок, в результате чего потеряли часть символов (то что и в фоксе зачастую случается, если работать с кириллицей при Codepage<>1251).
Максимум что можно "извлечь" из данной строки, это то что даёт выражение (для VFP9 - для более старых строки замены/заменителем придётся описывать по иному)
? STRCONV(CHRTRAN(m.lcBadString, 0hf0f1f2f3,0hd0d1d2d3), 11)
- т.е. принудительная замена некорректных байт Fx (с них в UTF8 начинаются 4-х байтные последовательности кодирующие всякие вымершие языки и прочую ерунду, но данный текст гарантировано не раскодируется, т.к. в таком варианте 3-й байт последовательности не может быть снова Fx - он должен быть из ряда 8x/9x/Ax/Bx) на соответствующие Dx
Вполне возможно что сервису "сносит крышу" тот способ которым вы делаете запрос - с SOAP вообще-то стараются не работать на столь низком уровне - используют ту же COM прослойку MS SOAP Toolkit...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
thumbs down
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
ВалШебНик
Автор

Сообщений: 10
Откуда: Ставрополь
Дата регистрации: 29.01.2009
Спасибо огромное.
Тоже подумал - что наверное надо использовать SOAP.
Буду пробовать через него.
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
ВалШебНик
Автор

Сообщений: 10
Откуда: Ставрополь
Дата регистрации: 29.01.2009
Вот же:
пробую функцию - где пара аргументов передается - все ОК.
Даже кодировка теперь человеческая, то есть читаемая
А вот функция, где 36 параметров - стоит ругань Too many arguments
Перебрал все.
Даже так forum.foxclub.ru
Фиг. Ставлю меньше - летит ошибка SOAP - неверное число параметров
Я с ума сойду
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
ВалШебНик
Автор

Сообщений: 10
Откуда: Ставрополь
Дата регистрации: 29.01.2009
Добрый день.
Вопрос:

Вот реальная функция, которая лежит на сервисе:


POST /Service1.asmx HTTP/1.1
Host: socpwebservice.xxx.ru
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://socpwebservice.xxx.ru/SOCP_Send_Payment"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SOCP_Send_Payment xmlns="http://socpwebservice.xxx.ru/">
<type_maket_in>string</type_maket_in>
<br_in>string</br_in>
<n1_in>string</n1_in>
<nd_in>string</nd_in>
<cy_in>string</cy_in>
<dd_wr_in>string</dd_wr_in>
<ls_in>string</ls_in>
<co_in>string</co_in>
<kp_in>string</kp_in>
<u1_in>string</u1_in>
<u2_in>string</u2_in>
<u3_in>string</u3_in>
<n3_in>string</n3_in>
<r0_in>string</r0_in>
<r1_in>string</r1_in>
<r2_in>string</r2_in>
<r3_in>string</r3_in>
<r4_in>string</r4_in>
<r5_in>string</r5_in>
<r6_in>string</r6_in>
<r7_in>string</r7_in>
<r8_in>string</r8_in>
<r9_in>string</r9_in>
<na_in>string</na_in>
<py_in>string</py_in>
<sys_id_in>string</sys_id_in>
<fio_user_in>string</fio_user_in>
<provider_id_in>string</provider_id_in>
<service_id_in>string</service_id_in>
<addr_user_in>string</addr_user_in>
<out_id_in>string</out_id_in>
<w2_in>string</w2_in>
<ext_response>string</ext_response>
<str_error>string</str_error>
<n_maket_out>string</n_maket_out>
<d_maket_out>string</d_maket_out>
</SOCP_Send_Payment>
</soap:Body>
</soap:Envelope>

Здесь ей надо передать 36 параметров.
Я делаю вот так:

oSoapClient = CREATEOBJECT("MSSOAP.SoapClient30")
oSoapClient.MSSoapInit("https://socpwebservice.xxx.ru/Service1.asmx?WSDL")

описываю переменные
Par1 =
Par2 =
..
Par36 =
и пытаюсь выполнить функцию
oSoapClient.SOCP_Send_Payment(Par1,Par2,Par3,Par4...Par36)
Еще на этапе компиляции вылетаю ошибка - TOO MANY ARGUMENTS

Если вот так:
lccommand = "oSoapClient.SOCP_Send_Payment(Par1,Par2,Par3,Par4...Par36)"
&lccommand

То эта ошибка происходит при выполнении кода.

Тут в силу некоторых особенностей - я повлиять на сервис не могу, а есть реально
работающий код на - если не изменяет память - на Pascal

Где мои грабли? Что я делаю не так?
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
ВалШебНик
Автор

Сообщений: 10
Откуда: Ставрополь
Дата регистрации: 29.01.2009
ВСЕ! Добился!
Прокладку MSSOAP к сожалению использовать невозможно по причине
ограничения фокса на передачу 26 параметров, а нужно 36 (см.выше).
Огромное спасибо - Игорю Королёву - навели на мысль
И Владу Колосову - за его примеры (кстати тоже работает напрямую)

Работающий код:

oHTTPS = NEWOBJECT("MSXML2.XMLHTTP")
oHTTPS.Open("POST","https://socpwebservice.voz.ru/Service1.asmx?WSDL",.f.)
oHTTPS.SetRequestHeader("Content-Type","text/xml; charset=utf-8")
oHTTPS.SetRequestHeader("Content-length",LTRIM(STR(LEN(cSendBody))))

TRY
oHTTPS.Send(cSendBody)
CATCH
lExitFunction = .T.
ENDTRY

IF oHTTPS.Status == 200
cResponseTxt = LOWER(ALLTRIM(oHTTPS.Responsetext))
ENDIF

Отчет читается, все ок! Всем спасибо принявшим участие в обсуждении.



Исправлено 1 раз(а). Последнее : ВалШебНик, 21.08.11 14:39
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Да, к сожалению у фокса есть такое ограничение по параметрам
Напрямую работать - оно можно, просто гарантировано сложнее будет - самому придётся и всякими "конвертациями" заниматься (из которых преобразование UTF8 в ANSI есть самое простое и безобидное), и SOAP протокол реализовывать - но действительно бывают ситуации, когда по иному никак


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
А как определить, что кодировка UTF8?
нам шлют одни в UTF8, другие в WIN1251
Пока не определились, но пока считаем, что мы должны отсылать в той кодировке, откуда получили.
Т.е. от ИК хотелось бы узнать обратный код к
STRCONV(CHRTRAN(m.lc, 0hf0f1f2f3,0hd0d1d2d3), 11)
Симметрично, получил, подправил и отослал



Исправлено 2 раз(а). Последнее : Ydin, 23.08.19 10:50
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
ИИ

У меня написалось вот так (слабонервным не смотреть):
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
2 of63
Подожду, я слабонервный. Твой код интересен. Но по-быстрому не прочтешь.
Классно - комменты.
Я хочу подождать ИК.

Мне сейчас другое бы успеть вовремя



Исправлено 1 раз(а). Последнее : Ydin, 23.08.19 11:11
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Для комментов и запостил, и чтобы посмотреть на "ИИ определения кодировки" изнутри, моими глазами

() Игорь, конечно, классный мембер, но основной форум он развратил...
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
По тему ключевое
ИК
? STRCONV(CHRTRAN(m.lcBadString, 0hf0f1f2f3,0hd0d1d2d3), 11)
И он автор. Везде он первый!
of63
но основной форум он развратил...
Как это?
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Как это?
Сам говоришь "Я хочу подождать ИК", типа думать не хочу, некогда, ИК решит. Ну да, решит, как за детей малых )
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Оффа, не обижайся. Спасибо, у меня вера, что твое поможет!
Но там не один вопрос, еще я жду от своих, они может сами это решат.
Т.е. мне можно подождать. Сейчас от меня ждут результата вне этого вопроса
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Не обижаюсь я, пока. На свой кодЮ на его оценку, оценку я знаю - чужой код г.вно, решение неправильное, автора кода повесить на вонючей веревке, код переписать на новоязе. Ненужное подчеркнуть )

Просто ИК работает на англичанку, перегружен, и тут мы, с ерундой
Ratings: 0 negative/0 positive
Re: UTF8 -> WIN1251
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если в файле нет BOM или, если это не файл а, к примеру, письмо или html страница, или xml и там нет соответствующих заголовков - то остаётся лишь эвристический анализ. Много лет назад печатался в какой-то компьютерной газете (ещё бумажной) алгоритм подобной эвристики от автора одной из программ-декодеров, ну тех что сами "угадывали" кодировку текста. Увы, сейчас не могу найти... Даже статью про "кракозябры" нехорошие пассивные гомосексуалисты зачем-то удалили из википедии
Просто в наше время проще организационно решить такую проблему, нежели пытаться "угадывать" кодировку. Тем более что эффективно подобная эвристика работает лишь на достаточно больших объёмах текста написанных на одном языке, с минимумом всяких аббревиатур и сокращений.
P.S. Код оффы "не смотрел, но осуждаю" А если серьёзно, то проще и спокойнее решить проблему не программным способом (прикрывая идиотизм начальства и каких-то юзеров). Самая известная утилита-декодер "штирлиц" почила в бозе в далёком 2001 году - и это правильно.
P.P.S. И добавить нечего
Цитата:
Альтернативная точка зрения считает подобные эвристические алгоритмы определения кодировки текста вредными, поскольку современные информационные технологии располагают средствами недвусмысленно сопоставить тексту положенную ему кодовую страницу (см., например, MIME). Широкое же распространение эвристических анализаторов поощряет использование некачественных программ создания текстовых данных, нарушающих стандарты.
Завтра начнут ещё и фотографии этих самых текстов присылать (тыжпрограммист, разберёшься), если сразу на место не поставить "вредителей"


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 BOBAN  (Гостей: 21)

© 2000-2024 Fox Club 
Яндекс.Метрика