Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy.get Umlaute = ? (https://www.delphipraxis.net/192550-indy-get-umlaute-%3D.html)

Youuuu 29. Apr 2017 16:25

Indy.get Umlaute = ?
 
Hi,

ich habe ein Problem mit Indy momentan. Sobald ich den Quelltext per http.get mir hole, werden die Umlaute als normales "�" dargestellt.


Delphi-Quellcode:
with http do begin
        HandleRedirects := True;
        AllowCookies := False;
        RedirectMaximum := 10;
        Request.UserAgent := useragent;
        Request.Accept := 'text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1';
        Request.AcceptCharSet := 'iso-8859-1, utf-8, utf-16, *;q=0.1';
        Request.ContentEncoding := 'UTF-8';
        Request.ContentType := 'application/x-www-form-urlencoded';
      end;
      source := (http.Get( url) );
Kann hier jemand Abhilfe schaffen?

nahpets 29. Apr 2017 16:57

AW: Indy.get Umlaute = ?
 
Welche Delphiversion?

Bekommst Du mit http.get auf jeden Fall auch UTF8?

Wenn nein, dann nur UTF8ToAnsi nutzen, wenn es auch tatsächlich UTF8 ist, was da ankommt.

Im Ansizeichensatz sind nicht alle Zeichen enthalten, die es in UTF8 gibt.
Die fehlenden Zeichen werden dann (meist) als ? dargestellt.

Welche Fehler erhältst Du, wenn Du es nur mit source := http.Get(url) versuchst?

Youuuu 29. Apr 2017 16:59

AW: Indy.get Umlaute = ?
 
Ich htte grad den Eintrag editiert gehabt, wie es ohne Umwandlung aussieht.

Delphi 10.1 wird benutzt.

nahpets 29. Apr 2017 17:09

AW: Indy.get Umlaute = ?
 
Darf man den Inhalt von url erfahren? Dann könnte man mal nachschauen, wie es da genau aussieht, so ist das etwas schwierig.

Oder mal ein Beispiel von dem, was hinter url steckt (unbearbeitet als Anhang), hier zur Verfügung stellen.

Youuuu 29. Apr 2017 17:15

AW: Indy.get Umlaute = ?
 
Beispiel der Url:

Beispiel

Olli73 29. Apr 2017 17:17

AW: Indy.get Umlaute = ?
 
Welches charset hat denn die Seite?

Youuuu 29. Apr 2017 17:22

AW: Indy.get Umlaute = ?
 
<meta charset="utf-8">

Olli73 29. Apr 2017 17:29

AW: Indy.get Umlaute = ?
 
Komisch. Andere Seiten mit UTF-8 funktionieren bei mir, diese nicht.

Youuuu 29. Apr 2017 17:31

AW: Indy.get Umlaute = ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also hast du das gleiche Problem bei dieser Webseite?

Olli73 29. Apr 2017 17:37

AW: Indy.get Umlaute = ?
 
Der Unterschied zwischen dieser und der anderen (die funktioniert) ist, dass die andere echtes UTF-8 liefert, d.h. da steht auch z.B. "ö" drin. Bei deiner steht "&ouml;"

Youuuu 29. Apr 2017 17:39

AW: Indy.get Umlaute = ?
 
Habe ein Post vorher nun ein Bild angehangen, welches die übermittelten Daten ausgibt, dort ist von utf-8 nichts zu sehen. hm

nahpets 29. Apr 2017 17:42

AW: Indy.get Umlaute = ?
 
Ausgehend vom META-Tag bekommt man UTF-8.

Allerdings sind da die deutschen Umlaute auch ohne Umwandlung von UTF-8 nach Ansi enthalten.

Ferienwohnungen, Ferienhäuser, Zimmervermietung, Pension, Gästezimmer

Aber auch in dieser Form: Allgemeine Gesch&auml;ftsbedingungen

Wenn man von einigen Syntaxfehlern im HTML absieht, sollte man eigentlich ohne Umwandlung von UTF-8 nach irgendwas auskommen.

Ist diese Umwandlung denn bei Delphi 10.1 überhaupt noch nötig?

Mit Delphi 7 und ohne Rücksichtnahme auf den Zeichensatz, bekomme ich eine (zeichensatzmäßig) fehlerfreie Textdatei. Der Zeichzensatz dürfte iso-8859-1 sein.

&ouml; hat nichts mit UFT-8 zu tuen (siehe Self-HTML: Referenz:HTML/Zeichenreferenz)

Youuuu 29. Apr 2017 17:46

AW: Indy.get Umlaute = ?
 
Wie hast du denn http.get aufgebaut, denn bei mir erhalte ich wie gesagt keinen anständigen Text

nahpets 29. Apr 2017 17:52

AW: Indy.get Umlaute = ?
 
Accept = text/html, */*.

Sonst nichts.

Bitte speichere Dein Ergebnis, zippe es und häng das dann hier mal an, möchte da mal reinschauen.

Wenn möglich beide Versionen:
Delphi-Quellcode:
source := http.Get(url);
und
Delphi-Quellcode:
source := UTF8ToAnsi(http.Get(url));

nahpets 29. Apr 2017 17:57

AW: Indy.get Umlaute = ?
 
Habe gerade mal das angehängte Bild angeschaut:

Da steht, dass Charset iso-8859-1 geliefert wird.
Content-Type ist ebenfalls iso-8859-1.

Die Angabe im Meta-Tag dürfte demnach falsch sein.

Youuuu 29. Apr 2017 18:12

AW: Indy.get Umlaute = ?
 
Delphi-Quellcode:
resp := TMemoryStream.Create;
      try
        with http do begin
          HandleRedirects := True;
          AllowCookies := False;
          RedirectMaximum := 10;
        end;
        http.Get( url, resp );
        resp.Position := 0;
        slSource := TStringList.Create;
        try
          slSource.LoadFromStream(resp);
          source := slSource.Text;
        finally
          FreeAndNil(slSource);
        end;
        Result := source;
      finally
        resp.Free;
      end;
Wenn ich es wie oben per Stream lade, funktioniert es, anders jedoch nicht.

a.def 29. Apr 2017 18:21

AW: Indy.get Umlaute = ?
 
Ich glaube hier könnten die "Delphi-Profis" helfen

- Uwe Raabe
bzw.
- Maverik

Michael II 29. Apr 2017 18:50

AW: Indy.get Umlaute = ?
 
Liest du die Berlin Webseite nur oder bis du Besitzer und hast somit Einfluss darauf wie sie abgespeichert ist?

Wenn ich deine Seite mit Chrome runterlade und dann im Editor öffne und unter Codierung nachsehe dann lese ich ANSI und nicht UTF-8 (wie bei ca. 90% aller Webseiten dieser Welt).

Falls du Einfluss auf die Webseite hast, dann speichere eine "öäü Test-Webseite" mal mit Codierung UTF-8 ab und checke, ob's nun klappt.


[Nebenbei: Ich habe auch noch alte ANSI codiert abgespeicherte Webseiten mit Formularen drauf. Bis mind. D X6 konnte man die Werte der übermittelten Felder locker mit TWebRequest.Contentfields auslesen. Bei späteren Delphis crasht das CGI bei Zugriff auf die ContenFields; Abhilfe: Webseiten UTF-8 codiert speichern oder wenn man nicht alles von ANSI auf UTF-8 umstellen mag Request.RawContent...]

himitsu 29. Apr 2017 19:29

AW: Indy.get Umlaute = ?
 
Zum Glück (oder eher leider) sind Browser sehr Fehlertolerant und versuchen massig Schrott auszumärzen.

Sonst würden viele Webseiten garnicht angezeigt werden und man sähe ständig nur Fehlermeldungen.
Tja, da hat man nun Probleme eine Webseite auszulesen.
Aber besser wäre es eh, wenn man eine offizielle Schnittstelle/API zu den gewünschten Daten verwenden würde, wenn der Seitenbetreiber sowas anbietet.

Die Delphi-PRAXiS kann man so z.B. problemlos per XML auslesen und muß die Informationen nicht mitten im HTML suchen. :stupid:

Michael II 29. Apr 2017 19:56

AW: Indy.get Umlaute = ?
 
Ich hab's rasch auf einem meiner Webserver gecheckt.

Wie vermutet: Speichere deine Webseite statt mit Codierung ANSI mit UTF-8 ab, dann werden die Umlaute korrekt angezeigt, d.h.: Lade die Webseite in einen Editor [wenn du ein neueres Windows hast, geht's auch mit dem "normalen" Editor von Windows], wähle Codierung UTF8 und speichere die Seite wieder ab. Lade sie hoch - und staune :-D.

Wenn du keinen Zugriff hast auf die Webseite dann müsstest du die heruntergeladene Seite umcodieren [Ich weiss, es gibt direktere Wege ;-)]:
hs := TStringList.Create;
hs.LoadFromFile( webseite, TEncoding.ANSI );
hs.SaveToFile( webseite, TEncoding.UTF8 );
und dann klappt es auch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:32 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