Entwickler-Ecke

Internet / Netzwerk - IdHTTP - Probleme mit Umlaute


LittleBen - Sa 04.01.14 18:24
Titel: IdHTTP - Probleme mit Umlaute
Hallo,
obwohl man so viel zu diesem Problem findet, habe ich es immer noch nicht hinbekommen, dass Umlaute richtig dargestellt werden :nixweiss:
Ich benutze Delphi 7 und Indy 10.
Habe so ziemlich alles probiert, was man hier so findet, aber nichts funktioniert :(

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var IdHTTP: TIdHTTP;
begin
 IdHTTP:= TIdHTTP.Create(nil);
 try
  memo1.Text:= UTF8Decode(IdHTTP.Get('http://xenforo.com/community/threads/umlaut-test-%C3%B6%C3%A4%C3%BC%C3%9F.96/'));
 finally
  IdHTTP.Free;
 end;

Weiß jemand, wie ich das zum Laufen bekomm?

Viele Grüße
Benny


Delete - Sa 04.01.14 19:15

Glaubst Du ernsthaft, dass alles, was auf einer Webseite ist, in ein Memo geladen werden kann?

Das kommt dann so an:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
<!DOCTYPE html>
<html id="XenForo" lang="en-US" dir="LTR" class="Public LoggedOut NoSidebar  Responsive" xmlns:fb="http://www.facebook.com/2008/fbml">
<head>

  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
  
    <meta name="viewport" content="width=device-width, initial-scale=1">
  
  
    <base href="http://xenforo.com/community/" />
    <script>
      var _b = document.getElementsByTagName('base')[0], _bH = "http://xenforo.com/community/";
      if (_b && _b.href != _bH) _b.href = _bH;
    </script>
  

  <title>Umlaut Test: Ã¶Ã¤Ã¼ÃŸ | XenForo Community</title>
...


jaenicke - Sa 04.01.14 19:59

Das ist doch genau sein Problem, wenn du in dein Ergebnis schaust, siehst du, dass die Umlaute kaputt sind...

Bei XE5 brauche ich kein UTF8Decode, da wird es einfach so korrekt angezeigt...
Ein Delphi 7 muss ich mal im virtuellen PC anschauen...


Delete - Sa 04.01.14 20:25

Die Function UTF8Decode ergibt auch kein gutes Ergebnis.

Memo1.lines.add(UTF8Decode('Umlaut Test: öäüÃY | XenForo Community'));

Ergebnis
Umlaut Test: öäü_Y | XenForo Community

Richtig wäre:
Umlaut Test: öäüß


jaenicke - Sa 04.01.14 20:34

So funktioniert es bei Delphi 7:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  IdHttp: TIdHTTP;
  Test: TStringStream;
begin
  IdHttp := TIdHTTP.Create(nil);
  try
    Test := TStringStream.Create('');
    try
      IdHttp.Get('http://xenforo.com/community/threads/umlaut-test-%C3%B6%C3%A4%C3%BC%C3%9F.96/', Test);
      Test.Position := 0;
      Memo1.Text := StringReplace(Utf8Decode(Test.DataString), #10#13#10, [rfReplaceAll]);
    finally
      Test.Free;
    end;
  finally
    IdHttp.Free;
  end;
Frag mich nicht warum, hab auch keine Lust zu suchen, dazu fehlt in Delphi 7 einfach zu viel Komfort. ;-)

Und wie schon geschrieben, bei XE5 kann ich das Ergebnis von Get einfach direkt ins Memo schreiben.


Delete - Sa 04.01.14 21:04

Funktioniert mit DELPHI 2009.


mandras - Sa 04.01.14 21:43

Mit D6 und Indy 9.0.17 geht's auch.


LittleBen - So 05.01.14 02:48

Funktioniert, wenn ich einfach nur den Inhalt vom Stream nehme:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 Stream:= TStringStream.Create('');
 try
  FIdHttp.Get(AUrl, Stream);
  Stream.Position:= 0;
  Result:= Stream.DataString;
 finally
  Stream.Free;
 end;

Die Funktion Utf8Decode liefert mir einen leeren String. Aber ich hab alles was ich brauche :)
Danke!


Martok - Mo 06.01.14 00:43

Moin!

Liest eigentlich nie jemand die Dokumentation (oder Quellcodes, hier: Funktionsheader)?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
uses ..., idHTTP, idGlobal;

var IdHTTP: TIdHTTP;
  s: string;
begin
 IdHTTP:= TIdHTTP.Create(nil);
 try
  s:= IdHTTP.Get('http://xenforo.com/community/threads/umlaut-test-%C3%B6%C3%A4%C3%BC%C3%9F.96/', TIdTextEncoding.UTF8);
  memo1.Text:= utf8decode(s);
 finally
  IdHTTP.Free;
 end;

D7, Indy 10.5.

Warum die das nicht aus den HTTP-Headern lesen ist mir absolut unklar.
Deswegen jedenfalls funktioniert auch der Umweg über Streams: da wird keine Transformation gemacht.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Frag mich nicht warum, hab auch keine Lust zu suchen, dazu fehlt in Delphi 7 einfach zu viel Komfort. ;-)
Really? Ctrl-Klick, Ctrl-Shift-Down?

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Und wie schon geschrieben, bei XE5 kann ich das Ergebnis von Get einfach direkt ins Memo schreiben.
Wenn ich raten müsste: weil Strings jetzt Charsets haben und die Konvertierung nicht mehr in Indy passiert sondern irgendwo anders.

Viele Grüße,
Sebastian