AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Zitat:
"dazu habe ich schon in einem anderen Beitrag das Problem erläutert." -> Post #10 aus dem anderen Beitrag (von gestern, weiter unten) enthält die URL einer Warez-Seite, und diese verwendet das Content-Encoding "br" |
AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Vielen Dank schon mal für die zahlreichen Antworten.
KodeZwerg: Mit deinem Code werden leider bei mir die kyrillischen Zeichen immer noch als Hieroglyphen angezeigt. Getestet habe ich es mit der folgenden Seite: mail.ru. Neutral General: Ich kann leider TStringStream nicht nutzen, da ich sonst den HTML Code bestimmter Seiten als Text nicht komplett angezeigt bekomme. |
AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Zitat:
Welche Seite denn? Und welche Delphi-Version benutzt du? |
AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Wegen der unvollständigen Anzeige des HTML Codes, habe ich das Problem in diesem Thema erläutert:
https://www.delphipraxis.net/196148-...g-geladen.html |
AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Auf dieser "dubiosen" Seite wurden heute weitere Beiträge hinzgefügt, somit hat sich der unvollständige HTML Code auf die Seite 37 verschoben:
https://ddl-warez.to/downloads/haupt...rt/D/seite/37/ |
AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Stell doch mal dein komplettes Projekt (Source) ohne kompilierung gepackt als .zip/.rar Anhang rein, kann ja nicht groß sein, vielleicht liegt der Fehler an ganz anderer Stelle.
|
AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Code:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdHTTP, Vcl.StdCtrls, Vcl.ExtCtrls, IdZLibCompressorBase, IdCompressorZLib, IdCookieManager, IdBaseComponent, IdComponent, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdSSLOpenSSLHeaders, IdCTypes; type TForm1 = class(TForm) Panel1: TPanel; Memo1: TMemo; Edit1: TEdit; Button1: TButton; IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; IdCookieManager1: TIdCookieManager; IdCompressorZLib1: TIdCompressorZLib; procedure Button1Click(Sender: TObject); procedure IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(ASender: TObject; const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType, AMsg: string); private { Private-Deklarationen } public { Public-Deklarationen } procedure SetNewIdHTTP; end; var Form1: TForm1; gIdHTTP : TIdHTTP; implementation {$R *.dfm} procedure TForm1.IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(ASender: TObject; const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType, AMsg: string); begin SSL_set_tlsext_host_name(AsslSocket, gIdHTTP.Request.Host); end; procedure TForm1.SetNewIdHTTP; begin if Assigned(gIdHTTP) then begin Memo1.Clear; gIdHTTP.Free; end; gIdHTTP := TIdHTTP.Create(nil); gIdHTTP.AllowCookies := True; gIdHTTP.HandleRedirects := True; gIdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1; gIdHTTP.CookieManager := IdCookieManager1; gIdHTTP.Compressor := IdCompressorZLib1; end; function StreamToText(sStream: TStream; sOldSign, sNewSign: Integer): AnsiString; var xBuf: TBytes; i : Integer; begin try SetLength(xBuf, sStream.Size); // puffer größe bestimmen sStream.ReadBuffer(Pointer(xBuf)^, Length(xBuf)); // puffer füllen for I := 0 to Length(xBuf) -1 do if xBuf[i] = sOldSign then xBuf[i] := sNewSign; // mache aus 0 ein Leerzeichen finally SetLength(Result, Length(xBuf)); // ausgabegröße for I := 0 to Length(xBuf) -1 do Result[i+1] := AnsiChar(xBuf[i]); // alles aus puffer ins Result end; end; function IdHTTP_Get(sHTTP: TIdHTTP; sURL: String): String; var xResult : TStringList; xMemoRes : TMemoryStream; begin xResult := TStringList.Create; xMemoRes := TMemoryStream.Create; try try sHTTP.Get(sURL, xMemoRes); xMemoRes.Position := 0; xResult.Text := StreamToText(xMemoRes, 0, 20); except on E: EIdHTTPProtocolException do begin xResult.Add('E.Message: ' + E.Message); xResult.Add('E.ErrorMessage:'); xResult.Add(E.ErrorMessage); end; end; finally Result := xResult.Text; xResult.Free; xMemoRes.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin SetNewIdHTTP; Memo1.Text := IdHTTP_Get(gIdHTTP, Edit1.Text); end; end. |
AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Hallo bogdan,
gut wäre ein Projekt-Upload gewesen für alle Properties (die stehen in der .dfm Datei) die Du so gesetzt hast. Auch gut zu Wissen was in Edit1.Text steht, nur eine blanko Webadresse ohne Endung? Soll das Ziel sein den HTML Source-Code zu laden oder eine bestimmte Datei? edit Hier ein Beispiel um HTTP HTML Sourcecode zu laden:
Delphi-Quellcode:
Alles noch unoptimiert aber vielleicht ist es ja das was Du wolltest?
function DownloadHTMLSource( var xUrl : ansiString ):ansiString;
const INET_USERAGENT = 'Mozilla/4.0, Indy Library (Windows; en-US)'; // Damit sagst Du "Hallo, ich bin..." INET_TIMEOUT_SECS = 3; // Wieviele Sekunden warten bevor Timeout kommt? INET_REDIRECT_MAX = 10; // Maximale Redirect-Tiefe begin with tIdHttp.create(nil) do begin // Create Indy http object request.userAgent := INET_USERAGENT; // Custom user agent string redirectMaximum := INET_REDIRECT_MAX; // Maximum redirects handleRedirects := INET_REDIRECT_MAX<>0; // Handle redirects readTimeOut := INET_TIMEOUT_SECS*1000; // Read timeout msec try // Catch errors Result := Get(xUrl); // Do the request if URL.Port = '80' then URL.Port := ''; // Remove port 80 from final URL xUrl := URL.GetFullURI // Return final URL <<- da könnte nun eine andere URL stehen als wie Du eingegeben hast except // Return an error message if failed on E: Exception do Result := 'Error! HTTP Adress: ' +xUrl+ #13#10 + 'E.Message: ' + E.Message; // Return Error Message end; free // Free the http object end end; procedure TForm1.Button1Click(Sender: TObject); var temp1, temp2: ansiString; i : Integer; begin Memo1.Clear; Memo1.Lines.Add('Working...'); Temp1 := Edit1.Text; if Length(Edit1.Text) > 0 then Temp2 := DownloadHTMLSource(Temp1); // hier noch irgendwas mit ansiString anstellen, zum Beispiel nullen entfernen for I := 1 to Length(Temp2) do if Temp2[i] = Char(Ord($00)) then Temp2[i] := Char(Ord($20)); Memo1.Lines.Text := Temp2; Memo1.Lines.Add('HTTP HTML Source from: '+Temp1); end; Viel Spass damit. Ps: Diesen Code solltest Du in einem leeren Projekt testen ohne Indy Komponenten aufm Formular aber in Uses. |
AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Zitat:
|
AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz