| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > Русская кодировка в post idhttp |
| Автор: Ruless 6.4.2010, 15:50 | ||
| Доброе время суток уважаемые программисты. Столкнулся с проблемой в работе с idhttp. при попытке отправить русские символы в запросе на сервер приходит что то вроде "???? ????????" Пробовал такой вариант.
В ответ получаю "%E7%E0%E3%EE%EB%EE%E2%EE%EA" Подскажите как верно изменить кодировку? |
| Автор: Akella 6.4.2010, 20:27 |
| Какая версия дельфи, инди - это мы должны угадывать? Добавлено через 32 секунды Какую кодировку нужно отправить серверу - тоже нужно отгадать? |
| Автор: Keeper89 6.4.2010, 20:33 |
Конечно, а ты как думал, иначе не интересно |
| Автор: Ruless 6.4.2010, 20:39 |
| Делфи -7, Инди 10. Кодировка на сервере вроде windows-1251. Добавлено через 1 минуту и 23 секунды |
| Автор: Akella 6.4.2010, 21:29 |
Имеется ввиду последняя юникодная версия? |
| Автор: Ruless 6.4.2010, 22:11 |
| да, версия юникодная . Обновлял пару недель назад. |
| Автор: Keeper89 7.4.2010, 00:34 |
| А просто AnsiToUTF8 не подойдет? |
| Автор: Ruless 7.4.2010, 09:52 |
получил ответ такого вида " ?=B7?=B0?????=BB????????" |
| Автор: Ruless 7.4.2010, 15:12 |
| При отправке через браузер и снятии данных снифером отправляется код " title=%E7%E0%E3%EE%EB%EE%E2%EE%EA" сервер понимает и выводит русские буквы. Если отправлять через делфи и использовать функцию URLEncode сервер принимает %E7%E0%E3%EE%EB%EE%E2%EE%EA и не переводит их на русскую кодировку.. Не понимаю куда копать.. |
| Автор: Ruless 8.4.2010, 17:15 | ||
| Проблема решена. Ответ крылся в невозможности TIdMultiPartFormDataStream работать с перекодированными данными. Использование TStringList решило все проблемы. Вопрос закрыт. Пример рабочего кода если кому интересно:
|
| Автор: hawkins 11.4.2010, 10:47 |
| а если бы требовались именно мультипатийный формат, то пришлось бы инди ковырять или на другую версию индей или делфи переводить прогу... |
| Автор: Gbukharov 15.4.2010, 05:36 | ||||||||||
| У меня аналогичная проблема. Данное решение не подходит. Пишу на Delphi 2010. Сервер (пробую на vkontakte.ru) принимает русские буквы в виде %E0%E1%E2%E3%E4..., т.е. абвгд... т. д. Но из idHttp идёт post в виде%D0%B0%D0%B1%D0%B2%D0%B3%D0%B4, где %D0%B0 - "а", %D0%B1 - "б" и т. д. Пробовал вручную перекодировать текст, но в idHttp в запросе символ % упорно заменяется на символ 25. Поясню на примере: пароль 'КатяИдеал' передается как %D0%9A%D0%B0%D1%82%D1%8F%D0%98%D0%B4%D0%B5%D0%B0%D0%BB, а надо %CA%E0%F2%FF%C8%E4%E5%E0%EB. Накатал тупую функцию перекодирования (не знаю, какая тут кодировка используется)
В коде программы при отладке все переводится как надо (%CA%E0%F2%FF%C8%E4%E5%E0%EB), но на сервер всё равно уходит %25CA%25E0%25F2%25FF%25C8%25E4%25E5%25E0%25EB (проверял через сниффер), т.е все вхождения % заменяются на %25. Кусок кода (на входе посылаются mail,pass:string):
Если использовать Convert(pass), то HTTP Analyzer перехватывает в разделе PostData:
в RawStream:
на что сервер отвечает:
Если делать AnsiToUTF8(pass), то уходит pass=%D0%A0%D1%99%D0%A0%C2%B0%D0%A1%E2%80%9A%D0%A1%D0%8F%D0%A0%C2%98%D0%A0%D2%91%D0%A0%C2%B5%D0%A0%C2%B0%D0%A0%C2%BB& Если делать UTF8ToAnsi, то pass=%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD Если описанную в посте Ruless ф-цию UrlEncode(pass), то pass=%2541A%25430%25442%2544F%25418%25434%25435%25430%2543B& Нужно же %CA%E0%F2%FF%C8%E4%E5%E0%EB неделю уже парюсь, кучу вариантов перепробовал с разных форумов, но ничего не помогает... Как заставить передаться верный текст? ==================================== выловил, где Delphi вставляет в код %25 - это class function TIdURI.ParamsEncode(const ASrc: string): string; модуля IdURI но как изменить код в нём? Внёс нужные мне исправления в функцию TIdURI.ParamsEncode, но никаких изменений не произошло. Даже когда изменил константу UnsafeChars = '*#%<> []' на UnsafeChars = '*#<> []', изменений не произошло, WatchWindow показывает старое значение '*#%<> []' |
| Автор: hawkins 19.4.2010, 16:06 |
| Gbukharov, используй TStringStream для отправки данных в методе http.post. В нем можно указывать кодировку при создании - TStringStream.Create('строка пост параметров', 1251); а для кодирования русских символов в строке параметров используй свой метод Convert. |
| Автор: iwpwork 26.3.2013, 13:21 |
| Ищите ответы на нормальных буржуйских форумах, а не на наших, где кроме как троллить - ничего не умеют. var ds: TIdMultipartFormDataStream; begin ds := TIdMultipartFormDataStream.Create; try ds.AddFormField('test', UTF8Encode('äöüß'), 'utf-8').ContentTransfer := '8bit'; try ShowMessage(HTTP.Post('http://localhost/test.php', ds)); except end; finally FreeAndNil(ds); end; end; |
| Автор: Akella 26.3.2013, 14:12 |
| http://forum.vingrad.ru/index.php?showtopic=338573&view=findpost&p=2555469 |