Entwickler-Ecke

Internet / Netzwerk - TIdHttp 10 unter D7: Get-Funktion mit falschen Sonderzeichen


stiftmaster - Mo 13.02.12 19:27
Titel: TIdHttp 10 unter D7: Get-Funktion mit falschen Sonderzeichen
Hallo,

ich verwendet Delphi 7 und steige gerade von Indy 9 auf Indy 10 um. Bisher habe ich problemlos folgende Code-Zeilen eingesetzt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  Indy: TIdHTTP;
  ergebnis: string;
begin
...
  ergebnis := Indy.Get(url);

  liste := TStringListe.Create;
  liste.clear;
  liste.Add(ergebnis);
  liste.SaveToFile('d:\test.txt');
...
end;


Dies hat soweit immer problemlos funktioniert. Die URL ist immer die gleiche und an der Webseite hinter der URL hat sich auch nichts geändert. Mit Indy 9 wurden auch die Sonderzeichen "üÜäÄ..." richtig angezeigt. Unter Verwendung von Indy 10 erscheint an Stelle des Sonderzeichen ein Fragezeichen.

Ich vermute, dass irgendetwas mit dem Encoding nicht stimmt - habe nämlich im Netz gelesen, dass Indy 10 dies automatisch setzt; aber leider nichts, wie ich es deaktiviere bzw. das Encoding selber setzen kann.

Hat jemand einen Tipp, wie ich das "Indy 9"-Verhalten wieder herstellen kann, denn ohne Sonderzeichen lebt es sich schwer :-)

Bin für jeden Tipp dankbar!

Gruß

Stefan


stiftmaster - Di 14.02.12 13:34

Hallo,

wenn ich meine Testseite im FireFox öffne und mir dann die unter "Extras" die "Seiteninformationen" anschaue, dann steht dort:
Typ: text/html
Anzeigemodus: Kompatibilitätsmodus (Quirks)
Kodierung ISO-8859-1

Daher habe ich meine Code folgendermaßen erweitert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  Indy := TIndy.Create(nil);

  Indy.Request.ContentEncoding := 'ISO-8859-1';
  Indy.Request.CharSet := 'ISO-8859-1';
  Indy.Request.ContentType := 'text/html';

  Memo1.Text := Indy.Get('http://test-server/index.php');


Leider bringt auch dies kein Ergebnis. Wechsel ich dann die Indy-Version wieder von 10 auf 9, dann läuft es direkt und ohne Probleme - auch ohne Angabe von ContentEncoding, CharSet und ContentType :-)

Bin für jeden Tipp dankbar

Gruß

Stefan


Nersgatt - Di 14.02.12 15:32

Schreibe das Ergebnis in einen Stream mit dem richtigen Encoding:

Delphi-Quelltext
1:
ResultStream := TStringStream.Create('', SysUtils.TEncoding.GetEncoding('ISO-8859-1'));                    


stiftmaster - Do 16.02.12 20:25

Hi,

vielen Dank für deinen Tipp. Leider hab ich keinen Plan, wie das gehen soll :-( Folgendes habe ich bereits versucht

Ich habe die Variable "ResultStream: TStringStream" angelegt - soweit so gut. Wenn ich dann das Create wie beschrieben eingebe, dann meckert Delphi 7, da Create nur eine Variable hat - nämlich einen String-Wert, allerdings keinen zweiten vom Typ TEncoding.

Den Get-Befehl habe ich dann wie folgt geändert: Indy.Get('http://test-server/index.php', ResultStream);
Doch wie wandel ich jetzt den TStringStream in einen "normalen" String um, so dass ich diesen an mein Memo übergeben kann: Memo1.Text := StringStreamToString(ResultStream) => irgend so was, oder nicht?

Bin für jeden weiteren Tipp sehr dankbar!

Gruß

Stefan