Главная страница
    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.5 MB
Время: 0.052 c
11-1182867408
Vladimir Kladov
2007-06-26 18:16
2008.02.03
Версия 2.71


4-1182855752
=BuckLr=
2007-06-26 15:02
2008.02.03
Забрать richtext из ricnedit


8-1173018362
Quelle
2007-03-04 17:26
2008.02.03
Градиент


2-1199628881
savyhinst
2008-01-06 17:14
2008.02.03
class function whatAshnyaga?


2-1199972940
AntonUSAnoV
2008-01-10 16:49
2008.02.03
как открыть файл из delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский