Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft (https://www.delphipraxis.net/196160-mit-idhttp-seite-aufrufen-und-memorystream-uebergeben-%3D-zeichen-fehlerhaft.html)

bogdan 27. Apr 2018 08:09

Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Mit dem folgenden Code lese ich den HTML Code der geladenen Web-Seiten auf:

Code:
function GetHTMLCode(xUrl: String): String;
var
  xResult : TStringList;
  xResMemo : TMemoStream;
begin
  xResult := TStringList.Create;
  xResMemo : TMemoStream.Create;
  try
    try
      IdHTTP1.Get(xUrl, xResMemo);
      xResMemo.Position := 0;
      xResult.Text := StreamToText(xResMemo, ' ', 00);
    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;
    xResMemo.Free;
  end;
end;

function StreamToText(sStream: TStream; sNewSign: string; sOldSign: Integer): AnsiString;
var
  xLen, j, xSize : Integer;
  xTemp : string;
begin
  try
    xLen := sStream.Size;
    SetLength(Result, xLen);
    if xLen > 0 then
    begin
      sStream.ReadBuffer(Result[1], xLen);
      for j := 1 to xLen do
      begin
        if Ord(Result[j]) = sOldSign then
        begin
          xTemp := xTemp + sNewSign
        end else
        begin
          xTemp := xTemp + Result[j];
        end;
      end;
    end;
  finally
    Result := xTemp;
  end;
end;
Damit der HTML Code der aufgerufenen Seiten vollständig als Text angezeigt werden kann muss ich ein MemoryStream nutzen, dazu habe ich schon in einem anderen Beitrag das Problem erläutert.
Allerdings habe ich jetzt das Problem das kyrillische, chinesische, usw. Zeichen als Hieroglyphen angezeigt werden.
Wie kann man die Zeichen aus der Funktion richtig in einen Text kodieren?

KodeZwerg 27. Apr 2018 08:14

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Du greifst auf Result zu?

Neutral General 27. Apr 2018 08:15

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Ich schätze fast ein TStringstream mit dem richtigen Encoding macht einerseits deine StreamToText procedure überflüssig und würde wahrscheinlich das richtige Ergebnis liefern.

Zitat:

Zitat von KodeZwerg (Beitrag 1400674)
Du greifst auf Result zu?

?

sStream.ReadBuffer(Result[1], xLen);

schreibt Daten in Result, falls das die Frage war.

mjustin 27. Apr 2018 08:17

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Welches Encoding wird verwendet (UTF-8, UTF-16, ...)?

mjustin 27. Apr 2018 08:25

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Zitat:

Zitat von mjustin (Beitrag 1400677)
Welches Encoding wird verwendet (UTF-8, UTF-16, ...)?

Edit: ok, es ist UTF-8, das wird von Indy unterstützt.

Allerdings scheint die Seite mit einem speziellen Content-Encoding geliefert zu werden (im Browser-Debugger von Firefox wird dies angezeigt):

Content-Encoding: br

Indy unterstützt dieses Encoding anscheinend nicht (Brotli).

Neutral General 27. Apr 2018 08:28

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Zitat:

Zitat von mjustin (Beitrag 1400679)
Zitat:

Zitat von mjustin (Beitrag 1400677)
Welches Encoding wird verwendet (UTF-8, UTF-16, ...)?

Edit: ok, es ist UTF-8, das wird von Indy unterstützt.

Allerdings scheint die Seite mit einem spezielles Content-Encoding geliefert zu werden (im Browser-Debugger von Firefox wird dies angezeigt):

Content-Encoding: br

Indy unterstützt dieses Encoding anscheinend nicht (Brotli).

Woher weißt du um welche Seite es sich handelt? :shock:

mjustin 27. Apr 2018 08:29

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Zitat:

Zitat von Neutral General (Beitrag 1400680)
Woher weißt du um welche Seite es sich handelt? :shock:

Aus Beitrag #10

Neutral General 27. Apr 2018 08:48

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Zitat:

Zitat von mjustin (Beitrag 1400681)
Zitat:

Zitat von Neutral General (Beitrag 1400680)
Woher weißt du um welche Seite es sich handelt? :shock:

Aus Beitrag #10

Ehm okay. Back to the future schätze ich.
Dir ist klar, dass der Beitrag den ich gerade von dir zitiere #7 ist?
Meiner wird #8 sein. #9+ existieren (noch) nicht..

KodeZwerg 27. Apr 2018 08:51

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
So hier meinte ich, nur grob hier hin gekritzelt, ich hoffe das klappt.
Delphi-Quellcode:
Function MyFilter ( inStream: TStream ): AnsiString;
var
  xBuf: TBytes;
  i : Integer;
begin
  try
    SetLength(xBuf, inStream.Size); // puffer größe bestimmen
    inStream.ReadBuffer(Pointer(xBuf)^, Length(xBuf)); // puffer füllen
    for I := 0 to Length(xBuf) -1 do
      if xBuf[i] = 0 then xBuf[i] := 20; // 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;

Neutral General 27. Apr 2018 09:12

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
 
Also so funktionierts bei mir.
Damit kann ich http://www.visitkorea.or.kr/intro.html korrekt abrufen.
Delphi-Quellcode:
function TForm1.GetHTMLCode(xUrl: String): String;
var xResMemo : TStringStream;
begin
  xResMemo := TStringStream.Create('', TEncoding.UTF8);
  try
    IdHTTP1.Get(xUrl, xResMemo);
    xResMemo.Position := 0;
    Result := xResMemo.DataString
  finally
    xResMemo.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.
Seite 1 von 3  1 23      

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