Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Русская кодировка в post idhttp, проблемы с отправкой кирилицы через post 
V
    Опции темы
Ruless
  Дата 6.4.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 9.2.2009

Репутация: нет
Всего: нет



Доброе время суток уважаемые программисты.

Столкнулся с проблемой в работе с idhttp. при попытке отправить русские символы в запросе на сервер приходит что то вроде "???? ????????"
Пробовал такой вариант.
Код

 function URLEncode(const S3: string): string;
var
  Idx: Integer;
begin
  Result := '';
  for Idx := 1 to Length(S3) do
  begin
    if S3[Idx] in ['A'..'Z', 'a'..'z', '0'..'9', '-', '=', '&', ':', '/', '?', ';', '_', '.'] then
        Result := Result + S3[Idx]
    else
      Result := Result + '%' + IntToHex(Ord(S3[Idx]), 2);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
title:='заголовок';
data9.AddFormField('title',URLEncode(title));
IdHTTP1.post('http://domen.ru/index.html',data9,M);

end;

В ответ получаю "%E7%E0%E3%EE%EB%EE%E2%EE%EA"

Подскажите как верно изменить кодировку?



PM MAIL   Вверх
Akella
Дата 6.4.2010, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Какая версия дельфи, инди - это мы должны угадывать?

Добавлено через 32 секунды
Какую кодировку нужно отправить серверу - тоже нужно отгадать?
PM MAIL   Вверх
Keeper89
Дата 6.4.2010, 20:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 6
Всего: 58



Цитата(Akella @  6.4.2010,  20:27 Найти цитируемый пост)
Какая версия дельфи, инди - это мы должны угадывать?


Цитата(Akella @  6.4.2010,  20:27 Найти цитируемый пост)
Какую кодировку нужно отправить серверу - тоже нужно отгадать? 

Конечно, а ты как думал, иначе не интересно smile


--------------------
PM MAIL WWW   Вверх
Ruless
Дата 6.4.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 9.2.2009

Репутация: нет
Всего: нет



Делфи -7, Инди 10.
Кодировка на сервере вроде windows-1251.

Добавлено через 1 минуту и 23 секунды
 smile  smile)
PM MAIL   Вверх
Akella
Дата 6.4.2010, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Цитата(Ruless @  6.4.2010,  20:39 Найти цитируемый пост)
Инди 10.

Имеется ввиду последняя юникодная версия?
PM MAIL   Вверх
Ruless
Дата 6.4.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 9.2.2009

Репутация: нет
Всего: нет



да, версия юникодная . Обновлял пару недель назад.
PM MAIL   Вверх
Keeper89
Дата 7.4.2010, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 6
Всего: 58



А просто AnsiToUTF8 не подойдет?


--------------------
PM MAIL WWW   Вверх
Ruless
Дата 7.4.2010, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 9.2.2009

Репутация: нет
Всего: нет




Цитата(Keeper89 @  7.4.2010,  00:34 Найти цитируемый пост)
А просто AnsiToUTF8 не подойдет? 

получил ответ такого вида " ?=B7?=B0?????=BB????????"
PM MAIL   Вверх
Ruless
Дата 7.4.2010, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 9.2.2009

Репутация: нет
Всего: нет



При отправке через браузер и снятии данных снифером отправляется код " title=%E7%E0%E3%EE%EB%EE%E2%EE%EA" сервер понимает и выводит русские буквы.
Если отправлять через делфи и использовать функцию URLEncode сервер принимает %E7%E0%E3%EE%EB%EE%E2%EE%EA и не переводит их на русскую кодировку.. Не понимаю куда копать..
PM MAIL   Вверх
Ruless
Дата 8.4.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 9.2.2009

Репутация: нет
Всего: нет



Проблема решена. 
Ответ крылся в невозможности TIdMultiPartFormDataStream работать с перекодированными  данными.
Использование TStringList решило все проблемы. Вопрос закрыт.

Пример рабочего кода если кому интересно:

Код

 function URLEncode(const S3: string): string;
var
  Idx: Integer;
begin
  Result := '';
  for Idx := 1 to Length(S3) do
  begin
    if S3[Idx] in ['A'..'Z', 'a'..'z', '0'..'9', '-', '=', '&', ':', '/', '?', ';', '_', '.'] then
        Result := Result + S3[Idx]
    else
      Result := Result + '%' + IntToHex(Ord(S3[Idx]), 2);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
data: tstringlist;

begin
title:='Русский текст';
data:=TStringList.Create;
data.Clear;
data.Add('title='+URLEncode(title));

IdHTTP1.post('http://domen.ru/index.html',data,M);

end;

PM MAIL   Вверх
hawkins
Дата 11.4.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 8.9.2003

Репутация: нет
Всего: нет



а если бы требовались именно мультипатийный формат, то пришлось бы инди ковырять или на другую версию индей или делфи переводить прогу...
PM MAIL   Вверх
Gbukharov
Дата 15.4.2010, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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. Накатал тупую функцию 
перекодирования (не знаю, какая тут кодировка используется)
 
Код
function Convert(s:string):string;
var
  i,j: Integer;
const
  rus='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя';
  web='%С0%C1%C2%C3%C4%C5%A8%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DC%DB%DA%DD%DE%DF%E0%E1%E2%E3%E4%E5%B8%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FC%FB%FA%FD%FE%FF';
begin
  for j := 1 to Length(s) do
  if (pos(s[j],rus)>0) then begin
    result:=result+copy(web,3*(pos(s[j],rus)-1)+1,3);
  end
  else result:=result+s[j];
end; 


В коде программы при отладке все переводится как надо 
(%CA%E0%F2%FF%C8%E4%E5%E0%EB), но на сервер всё равно уходит 
%25CA%25E0%25F2%25FF%25C8%25E4%25E5%25E0%25EB (проверял через сниффер), 
т.е все вхождения % заменяются на %25.

Кусок кода (на входе посылаются mail,pass:string):
Код
 
function ConnectAndLogin(mail,pass:string):boolean;
var
  reqs:TStringList;
  resp,s:widestring;
  temptemp:integer;
begin
  http:=TIdHTTP.Create(nil);
  http.Request.ContentType:='application/x-www-form-urlencoded';
  coom:=TIdCookieManager.Create(http);
  http.AllowCookies:=true;
  http.CookieManager:=coom;
  http.HandleRedirects:=true;
  http.ProtocolVersion:=pv1_1;
  reqs:=TStringList.Create;
  reqs.Add('email='+mail);
  reqs.Add('pass='+pass); //здесь перекодирую или нет
     {если передавать просто pass, то на сервер уйдет %D0%9A%D0%B0%D1%82%D1%8F%D0%98%D0%B4%D0%B5%D0%B0%D0%BB,
      если Convert(pass), то преобразуется всё правильно, но на сервер уйдет %25CA%25E0%25F2%25FF%25C8%25E4%25E5%25E0%25EB 
     }
  reqs.Add('expire=1');
  reqs.Add('vk=');
  resp:=http.Post('http://login.vk.com/?act=login',reqs); // в сниффере видно неверно переданные параметры
  temptemp:=pos(WideString('id=''s'''),resp)+13;
  delete(resp,1,temptemp);
  s:=copy(resp,1,pos('''',resp)-1);
  reqs.Clear;
  reqs.Add('s='+s);
  reqs.Add('op=slogin');
  reqs.Add('redirect=1');
  reqs.Add('expire=1');
  reqs.Add('to=');
  resp:=http.Post('http://vkontakte.ru/login.php?',reqs);
  reqs:=http.Response.RawHeaders;
  getcookie(reqs.Text);
//и т.д.


Если использовать Convert(pass), то HTTP Analyzer перехватывает 
в разделе PostData: 
Код

ParameterName       Value
email            [email protected]
pass            %CA%E0%F2%FF%C8%E4%E5%E0%EB
expire            1
vk    
 - тут всё правильно, но
в RawStream: 
Код

POST /?act=login HTTP/1.0
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 88
Host: login.vk.com
Accept: text/html, */*
Accept-Encoding: identity
User-Agent: Mozilla/3.0 (compatible; Indy Library)

[email protected]&pass=%25CA%25E0%25F2%25FF%25C8%25E4%25E5%25E0%25EB&expire=1&vk=


на что сервер отвечает:
Код

HTTP/1.1 302 Found
Server: nginx/0.7.59
Date: Thu, 15 Apr 2010 02:54:00 GMT
Content-Type: text/html; charset=windows-1251
Connection: keep-alive
X-Powered-By: PHP/5.2.6-1+lenny3
Pragma: no-cache
Cache-control: no-store
Set-Cookie: remixchk=5; expires=Tue, 12-Apr-2011 01:29:47 GMT; path=/; domain=.vkontakte.ru
P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Location: http://vkontakte.ru/login.php?m=1&email=somemail%40yandex.ru
Vary: Accept-Encoding
Content-Length: 0

Если делать 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 показывает старое значение '*#%<> []' smile  Модуль сохранял, перезапускал проект и весь редактор - нет эффекта  smile 

Это сообщение отредактировал(а) Gbukharov - 15.4.2010, 12:08
PM MAIL   Вверх
Akella
Дата 16.4.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Цитата(Gbukharov @  15.4.2010,  05:36 Найти цитируемый пост)
выловил, где Delphi вставляет в код %25 - это class function TIdURI.ParamsEncode(const ASrc: string): string; модуля IdURI

это не дельфи меняет, а непосредственно компоненты инди


Цитата(Gbukharov @  15.4.2010,  05:36 Найти цитируемый пост)
но как изменить код в нём? Внёс нужные мне исправления в функцию TIdURI.ParamsEncode, но никаких изменений не произошло. Даже когда изменил константу UnsafeChars = '*#%<> []' на  UnsafeChars = '*#<> []', изменений не произошло, WatchWindow показывает старое значение '*#%<> []' smile  Модуль сохранял, перезапускал проект и весь редактор - нет эффекта  smile 

А перекомпилировал исходники инди?

И вообще. Смотрим в исходники вконтакта:
Цитата
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />

Среда разработки D2010 и компоненты Indi являются юникодными. А это значит, что тебе нужно отправлять на сервер НЕ юникод, а Win1251. Я не уверен, что 
Цитата(Gbukharov @  15.4.2010,  05:36 Найти цитируемый пост)
Если  делать UTF8ToAnsi,

выполнит правильную перекодировку

Тебе нужно правильно настроить саму компоненту idHTTP, чтобы на сервер передавалось всё в кодировке win1251.
Мне так кажется. На эксперименты нет ни времени, ни желания. Но, идею, надеюсь, ты понял?
PM MAIL   Вверх
hawkins
Дата 19.4.2010, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 8.9.2003

Репутация: нет
Всего: нет



Gbukharov, используй TStringStream для отправки данных в методе http.post. В нем можно указывать кодировку при создании -
 TStringStream.Create('строка пост параметров', 1251);

а для кодирования русских символов в строке параметров используй свой метод Convert.
PM MAIL   Вверх
iwpwork
Дата 26.3.2013, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0883 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.