![]() |
Модераторы: Snowy, Poseidon, MetalFan |
![]() ![]() ![]() |
|
Ruless |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 9.2.2009 Репутация: нет Всего: нет |
Доброе время суток уважаемые программисты.
Столкнулся с проблемой в работе с idhttp. при попытке отправить русские символы в запросе на сервер приходит что то вроде "???? ????????" Пробовал такой вариант.
В ответ получаю "%E7%E0%E3%EE%EB%EE%E2%EE%EA" Подскажите как верно изменить кодировку? |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
Какая версия дельфи, инди - это мы должны угадывать?
Добавлено через 32 секунды Какую кодировку нужно отправить серверу - тоже нужно отгадать? |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 6 Всего: 58 |
Конечно, а ты как думал, иначе не интересно ![]() |
|||
|
||||
Ruless |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 9.2.2009 Репутация: нет Всего: нет |
Делфи -7, Инди 10.
Кодировка на сервере вроде windows-1251. Добавлено через 1 минуту и 23 секунды ![]() ![]() |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
||||
|
||||
Ruless |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 9.2.2009 Репутация: нет Всего: нет |
да, версия юникодная . Обновлял пару недель назад.
|
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 6 Всего: 58 |
А просто AnsiToUTF8 не подойдет?
|
|||
|
||||
Ruless |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 9.2.2009 Репутация: нет Всего: нет |
||||
|
||||
Ruless |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 9.2.2009 Репутация: нет Всего: нет |
При отправке через браузер и снятии данных снифером отправляется код " title=%E7%E0%E3%EE%EB%EE%E2%EE%EA" сервер понимает и выводит русские буквы.
Если отправлять через делфи и использовать функцию URLEncode сервер принимает %E7%E0%E3%EE%EB%EE%E2%EE%EA и не переводит их на русскую кодировку.. Не понимаю куда копать.. |
|||
|
||||
Ruless |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 9.2.2009 Репутация: нет Всего: нет |
Проблема решена.
Ответ крылся в невозможности TIdMultiPartFormDataStream работать с перекодированными данными. Использование TStringList решило все проблемы. Вопрос закрыт. Пример рабочего кода если кому интересно:
|
|||
|
||||
hawkins |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 8.9.2003 Репутация: нет Всего: нет |
а если бы требовались именно мультипатийный формат, то пришлось бы инди ковырять или на другую версию индей или делфи переводить прогу...
|
|||
|
||||
Gbukharov |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 15.4.2010 Где: Иркутск Репутация: нет Всего: нет |
У меня аналогичная проблема. Данное решение не подходит. Пишу на 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 показывает старое значение '*#%<> []' ![]() ![]() Это сообщение отредактировал(а) Gbukharov - 15.4.2010, 12:08 |
||||||||||
|
|||||||||||
Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 4 Всего: 329 |
это не дельфи меняет, а непосредственно компоненты инди А перекомпилировал исходники инди? И вообще. Смотрим в исходники вконтакта:
Среда разработки D2010 и компоненты Indi являются юникодными. А это значит, что тебе нужно отправлять на сервер НЕ юникод, а Win1251. Я не уверен, что выполнит правильную перекодировку Тебе нужно правильно настроить саму компоненту idHTTP, чтобы на сервер передавалось всё в кодировке win1251. Мне так кажется. На эксперименты нет ни времени, ни желания. Но, идею, надеюсь, ты понял? |
||||
|
|||||
hawkins |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 8.9.2003 Репутация: нет Всего: нет |
Gbukharov, используй TStringStream для отправки данных в методе http.post. В нем можно указывать кодировку при создании -
TStringStream.Create('строка пост параметров', 1251); а для кодирования русских символов в строке параметров используй свой метод Convert. |
|||
|
||||
iwpwork |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 26.3.2013 Репутация: нет Всего: нет |
Ищите ответы на нормальных буржуйских форумах, а не на наших, где кроме как троллить - ничего не умеют.
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; |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Сети" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |