Текущий архив: 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.039 c