Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.03;
Скачать: CL | DM;

Вниз

Вопрос про перекодировку response (IdHTTP, Indy8->Indy10)   Найти похожие ветки 

 
vegarulez ©   (2007-12-20 13:05) [0]

Привет всем мастерам!

// предисловие к вопросу
c:\Program Files\Borland\Delphi6\Demos\Indy\HTTPClient\

PostData: Tmemo;
URL:Tedit;


var
Response: TStringStream;
begin
...

Response := TStringStream.Create("");
HTTP.Post(URL.Text, PostData.Lines, Response);

memoHTML.Lines.Text := Response.DataString

Response.Free;
...
end;


Вопрос заключается в следующем
в Indy8  Response.DataString - автоматически перекодировал ответ с сервера разбирая его по строкам, заменяя прочие символы на перекодированные уже.

Тот же пример делаю в Indy10 Response.DataString - не перекодированная - идёт в таком виде в каком передалась с сервера.
Вопрос как её перекодировать? В Indy10  в классе TIdHTTP, наверно есть автоматическая перекодировка? Поскажите.


 
MetalFan ©   (2007-12-20 13:19) [1]

и в каком же виде она идет?!
в какой кодировке?


 
vegarulez ©   (2007-12-20 14:23) [2]

ну в виде урленкодед строки типа
test&id=3&time=20-12-207%2012%3A50%3A48%20%2B0300.... и т.д.
типа такого... плюс все русские слова буквы тоже в вин1251 не перекодировнные...

эта же срока в Indy8 выглядела бы так

test
id=3
time=20-12-207 12:50:48 +0300
и  т.д...


 
MetalFan ©   (2007-12-20 19:12) [3]

так в индях есть TIdURI. есть в ней функции URLEncode, URLDecode...
попробуй их попользовать.


 
vegarulez ©   (2007-12-21 11:23) [4]

пробую...
только всё рно, чо-то не получается то что хотелось бы получить...

он мне в русские буквы перебил, но там биллибирда получилась...
в перевод строки  разделитель "&" тоже не перевёл...

Он видимо в какую нить UTF-8 по умолчанию перебивает?... а мне требэ в нормальный читабельный вид... в вин1251...


 
vegarulez ©   (2007-12-21 11:24) [5]

В vegarulez ©   (20.12.07 14:23) [2] я ошибся, написал
ну в виде урлЕНкодед строки типа
вместо
ну в виде урлДЕкодед строки типа


 
MetalFan ©   (2007-12-21 23:16) [6]

UTF8Decode UTF8Encode ?


 
vegarulez ©   (2007-12-22 06:42) [7]

сечас взял скопировал эту сроку из  мемо, которую уже url`енкодил, и вставил в текстовый редактор "как ANSI" и она оказалась нормально перекодированной....

т.е. просто видимо она как то в TMemo не так как надо добавляется, и поэтому криво там отображается...  
а добавляю я её так:


Procedure...
var url:TIdURI;
begin
 url:=TIdURI.Create();
 memo2.Text:=URL.URLDecode(memoHTML.Text);
 url.free;
end;


Подскажите как правильно добавить чтоб она номано отбражалась...


 
vegarulez ©   (2007-12-22 06:44) [8]

MetalFan ©   (21.12.07 23:16) [6]

Может как раз для memo2 это применить? ANSI это какя кодировка?


 
MetalFan ©   (2007-12-22 19:52) [9]

что получается после URLDecode?


 
vegarulez ©   (2007-12-24 08:39) [10]

вот что получается в memo2.Text после URLDecode(сразу попутно вопрос это какая кодировка):

RESULT&id=353&code=1001&omsg=&cmsg=ъБСЧЛБ ПФЛМПОЕОБ. оЕ
7ЕТОП ХЛБЪБОЩ ТЕЛЧЙЪЙФЩ РПРПМОD1ЕНПЗП УЮЕФБ.&time=21-12-2007 09:53:36 +0300&

если копируешь и вставляешь копи пастом то в редакторе получаю вот такое(сразу попутно вопрос это какая кодировка):

RESULT&id=353&code=1001&omsg=&cmsg=úÁÑ×ËÁ ÏÔËÌÏÎÅÎÁ. îÅ
7ÅÒÎÏ ÕËÁÚÁÎÙ ÒÅË×ÉÚÉÔÙ ÐÏÐÏÌÎD1ÅÍÏÇÏ ÓÞÅÔÁ.&time=21-12-2007 09:53:36 +0300&

если в редактор вставляю (Как ANSI) то получаю вот что(сразу попутно вопрос это какая кодировка):

RESULT&id=353&code=1001&omsg=&cmsg=Заявка отклонена. Не
7ерно указаны реквизиты пополнD1емого счета.&time=21-12-2007 09:53:36 +0300&

т.е. вставляется в редактор почти верно (за исключением маленьких косяков в слове 7ерно д.б. верно и пополнD1емого д.б. пополняемого)

в инди8 нужная строка сразу формировалась в memoHTML после команды:
memoHTML.Lines.Text := Response.DataString

и выглядела так:

RESULT
id=353
code=1001
omsg=
cmsg=Заявка отклонена. Неверно указаны реквизиты пополняемого счета.
time=24-12-2007 08:36:19 +0300

Тоже самое надо в инди10 получить собственно...


 
vegarulez ©   (2007-12-24 09:23) [11]

в инди10 эта строка в memoHTML после команды:
memoHTML.Lines.Text := Response.DataString

выглядит так:

RESULT&id=353&code=1001&omsg=&cmsg=%FA%C1%D1%D7%CB%C1%20%CF%D4%CB%CC%CF%CE%C5%CE%C1.%20%EE%C5%D7%C5%D2%CE%CF%20%D5%CB%C1%DA%C1%CE%D9%20%D2%C5%CB%D7%C9%DA%C9%D4%D9%20%D0%CF%D0%CF%CC%CE%D1%C5%CD%CF%C7%CF%20%D3%DE%C5%D4%C1.&time=21-12-2007%2009%3A53%3A36%20%2B0300&


 
MetalFan ©   (2007-12-25 01:03) [12]

UTF8Decode не помогло?


 
vegarulez ©   (2007-12-25 14:51) [13]

нет не помогло  - при этом строка вообще оставалась чистой...
помогло другое...
Эта кодировка Koi8. Следовательно надо было Koi8 в вин1251 перебить:


type
 TConvertChars = array [ #128..#255] of char;

const

 Koi_WinChars: TConvertChars = (
 #128,#129,#130,#131,#132,#133,#134,#135,#136,#137,#138,#139,#140,#141,#142,#143,
 #144,#145,#146,#147,#148,#149,#150,#151,#152,#153,#218,#155,#176,#157,#183,#159,
 #160,#161,#162,#184,#186,#165,#166,#191,#168,#169,#170,#171,#172,#173,#174,#175,
 #156,#177,#178,#168,#170,#181,#182,#175,#184,#185,#186,#187,#188,#189,#190,#185,
 #254,#224,#225,#246,#228,#229,#244,#227,#245,#232,#233,#234,#235,#236,#237,#238,
 #239,#255,#240,#241,#242,#243,#230,#226,#252,#251,#231,#248,#253,#249,#247,#250,
 #222,#192,#193,#214,#196,#197,#212,#195,#213,#200,#201,#202,#203,#204,#205,#206,
 #207,#223,#208,#209,#210,#211,#198,#194,#220,#219,#199,#216,#221,#217,#215,#218) ;

function Win_KoiConvert(const St: string): string;
var
 i: integer;
begin
 Result:=St;
 for i:=1 to Length(St) do
   if St[i]>#127 then
     Result[i]:=Koi_WinChars[St[i]];
end;



Так что проблема решена.


 
vegarulez ©   (2007-12-25 14:53) [14]

Тока вот одно всё таки не понятно...
Почему в инди8 автоматом было... а в 10-ых индецах такая петрушка?....

[Внутренний голос: Чувствую, без Анатолия тут не обойтись....]


 
vegarulez ©   (2007-12-30 07:40) [15]

Продвигаюсь дальше...
и тут возникла вот такая проблема почему-то в Инди 10 когда ставлю Content-Type:

text/plain; charset=Windows-1251

при пост запросе на сервер - он мне выдаёт ошибку -
400 Bad request

Если ставлю application/x-www-form-urlencoded - всё проходит нормально запрос идёт на сервер, только некоторые параметры он перекодирует так, что сервер их не может разобрать - и выдаёт ошибку... (в инди 8 при text/plain; charset=Windows-1251 они передавались нормально не перекодированные и всё было нормально)
если же оставляю поле Content-Type пустым, то он по умолчанию берёт application/x-www-form-urlencoded...и опять их перекодирует...

procedure TIdCustomHTTP.Post(AURL: string; ASource: TIdStrings; AResponseContent: TIdStream);
var
 LParams: TIdStream;
begin
 Assert(ASource<>nil);
 Assert(AResponseContent<>nil);

 // Usual posting request have default ContentType is application/x-www-form-urlencoded
 if (Request.ContentType = "") or (TextIsSame(Request.ContentType, "text/html")) then {do not localize}
   Request.ContentType := "application/x-www-form-urlencoded"; {do not localize}

 LParams := TIdStringStream.Create(SetRequestParams(ASource));
 try
   Post(AURL, LParams, AResponseContent);
 finally
   Sys.FreeAndNil(LParams);
 end;
end;


В инди 8 при указании Content-Type: text/plain; charset=Windows-1251 нужные мне параметры запроса на сервер не кодировались и сервер нормально их разбирал и нормально с ним работал.

Подскажите в чём тут дело? как передать Post c Content-Typ`ом  text/plain; charset=Windows-1251 и чтобы он их не урленкодил....


 
vegarulez ©   (2008-01-07 18:43) [16]

Up


 
MetalFan ©   (2008-01-07 20:05) [17]

ищи hoForceEncodeParams
а разве в Content-Type чарсет можно указывать?



Страницы: 1 вся ветка

Текущий архив: 2008.02.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
15-1199198475
Kirill
2008-01-01 17:41
2008.02.03
Удалить ярлыки из адресной строки


2-1199575318
koha overload
2008-01-06 02:21
2008.02.03
Помогите разобраться под что модуль написан?


6-1176297172
mm0
2007-04-11 17:12
2008.02.03
Помогите с отправкой sms


15-1196332511
Tornado
2007-11-29 13:35
2008.02.03
Установка EhLib


4-1182263344
golum
2007-06-19 18:29
2008.02.03
Есть ли способы перехвата клавиш...