![]() |
Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Hallo,
ich habe folgenden Code:
Delphi-Quellcode:
Damit lese ich also den HTML-Code einer URL aus. Jedoch habe ich das Problem, dass bei manchen Webseiten nur z.B. folgendes herauskommt:
var
HTMLCode: TStringList; [...] function DownloadHTML(URL: String): String; begin try Result := IndyHTTP.Get(URL); except Exit; end; Result := StringReplace(Result, #13, #13#10, [rfReplaceAll]); end; Zitat:
Ich habe bisher keine Fehlerlösung gefunden... Hat hier vielleicht jemand eine Idee? Have fun, MCXSC |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Hallo Marcel,
nicht alle HTML-Seiten werden gleich passend im Windows ANSI Code ausgeliefert (CP1252). Probiere es mal so:
Delphi-Quellcode:
Grüße vom marabu
// ...
Result := Utf8ToAnsi(IndyHTTP.Get(URL)); // ... |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Muss man hier vor dem Aufruf von Utf8ToAnsi überprüfen, ob es utf8 kodiert ist, oder kann man bedenkenlos alles an die Funktion übergeben ?
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Hallo Christian,
es liegt in der Natur der Sache, dass ein AnsiString stets beides enthalten kann. Die Erkennung der UTF-8 Lead-Bytes ist genau die Spezialität der Ansi-Funktionen - und auch Utf8ToAnsi() beherrscht das gut. Freundliche Grüße |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Wenn sie denn der Webserver ausliefert. Afaik kann der Internet Explorer nicht mit den BOMs umgehen.
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Du hast oben zwar eine Stringlist deklariert, aber benutzt keine, zumindest nicht in dem Code den du gepostest hast.
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Liste der Anhänge anzeigen (Anzahl: 1)
[Off-Topic]Thunderbird hat wohl etwas zu viel Automatismus bezüglich übereiliger UTF8-Decodierung eingebaut[/Off-Topic]
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Doch ich benutze sie... Mal ein wenig mehr Code:
Delphi-Quellcode:
Zwar ein bisschen gekürzt, aber das wichtige ist drin.
var
HTMLCode: TStringList; function DownloadHTML(URL: String): String; begin try Result := UTF8ToANSI(HTTP.Get(URL)); except Exit; end; Result := StringReplace(Result, #13, #13#10, [rfReplaceAll]); end; function BearbeiteHTML(HTML: TSTringList): String; begin //... end; procedure Suchen(MyString: String;); begin HTMLCode := TStringList.Create; Dothisandthis(Filmtitel); FreeAndNil(HTMLCode); end; procedure Dothisandthis(MyString: String); var i: Integer; begin HTMLCode.Text := DownloadHTML('http://www.domain.url'); HTMLCode.Text := BearbeiteHTML(HTMLCode); if Pos('[i]XXX[/i]', HTMLCode.Text) <> 0 then Exit else begin //... end; end; Der Compiler gibt ab dem "if Pos('XXX', HTMLCode.Text) <> 0 then Exit" den oben genannten Fehler aus. Zitat:
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Wieso benutzt du nicht den TWebBrowser und MSHTML und damit IHTMLDocument und gehst durch all deine gewünschten Elemente? IE + MSHTML nimmt dir doch das ganze Charset/Codierung sowie die m.E. unpassenden POS-Aufrufe für ein Dokumentenformat ab für welches man viel einfacher über den DOM eines dafür entwickelten Komponente geht.
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Bist du dir sicher, dass der Fehler in der Zeile "if Pos('XXX', HTMLCode.Text) <> 0 then Exit" ist, was steht denn in HTMLCode.Text drinnen ?
Greifst du denn in dem else-zweig auf HTMLCode zu ? |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Ich teste grade, aber bis dahin kommt der Compiler eben (habe da auch mal nen Haltepunkt) gesetzt.
Und speichern kann ich die StringList eben auch (vorher) [HTMLCode.SaveToFile('dateiname.txt')], und der Inhalt ist halt so, wie er sein soll, aber immer noch mit dem Umlautproblem. Und ja: Später wird noch auf die HTMLCode zurückgegriffen. //Edit: Mal davon abgesehen, scheint UTF8toANS() hier nicht zu greifen... |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Nein, ich lese kein [i]-Element aus. Okay, da du wohl einen Grund brauchst, gebe ich dir einen (auch wenn es nichts zur Sache tut):
Wenn die Zeile "XXX" in dem Code vorkommt (oder im Original: "Keine Ergebnisse") soll eine MessageBox ausgegeben werden (im kurzen Ausschnitt eben "exit"). Werden allerdings Ergebnisse gefunden, so geht es weiter. Dann wird der obere HTML-Code weggeschnitten und es wird nach z.B. "<td>Genre:</td>" gesucht und weiter ausgelesen. Sprich: Es ist ein Teil der HTML-Auslesefunktion von ![]() |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Wenn er welche findet, liefert dir pos aber <> 0 zurück und geht raus :wink:
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
Zitat:
Übrigens. Das Design deiner Seite ist ja ziemlich Hip. :thumb: |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
Zitat:
Zitat:
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
Delphi-Quellcode:
dann muss es schon "= 0" heisen.
if Pos('[i]XXX[/i]', HTMLCode.Text) <> 0 then Exit
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
Delphi-Quellcode:
begin
HTMLCode.Text := DownloadHTML('http://www.domain.de...'); if Pos('[i]Keine Ergebnisse[/i]', HTMLCode.Text) <> 0 then ShowMessage('Es wurde kein Film auf OFDb.de gefunden!') else begin //... end; end; |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Alles klar, ok.
Aber wenn ein Listenindex das Maximum überschreitet, geht das imho nu, wenn man eben auch per index sich was aus der Stringlist rausfischt. Der Fehler kann also eigentlich nur in Zusammenhang mit HTMLCode[i] auftreten. |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Ja, das stimmt. Ich weiß nun auch, wo der Fehler liegt oder eher lag:
Wenn UTF8toANSI nichts zu tun hat, so liefert es einen leeren String zurück. Da die Funktion bei der Übergabe von HTMLCode.Text wohl nur die erste Zeile "gescannt" hat (also HTMLCode[0]), und ab HTMLCode[1] nichts mehr gemacht hat, war eben dieses leer. Ich habe es nun in etwa so gelöst, dass ich eine neue StringList erstellt habe, und jede Zeile von HTMLCode einzelnd durchlaufe und umwandel lasse, und diese Zeilen eben in der neuen Stringlist zusammensetzen lasse. |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Hi,
mit PHP löse ich so ein Problem wie folgt: $bad_char=array("ä","ö","ü","Ä","Ö","Ü","ß" ); $right=array('ä','ö','ü','Ä','Ö','Ü','ß'); $text=str_replace($bad_char,$right,$row["beschreibung"]); $text = htmlentities($text); d.h. ich ersetze in dem String einfach die falschen ($bad_char) durch die richtigen ($right) ich denke das ist auch mit Delphi möglich. |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
|
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Moin,
Zitat:
Und was das Analysieren von markup angeht: Jeder Text gehorcht einer mehr oder weniger komplexen Grammatik - und wenn es bereits einen Parser für die Grammatik gibt, dann bist du einfach nur gut beraten, wenn du ihn auch benutzt. Zugegeben, die OFDb-Seite ist kaum für eine programmgesteuerte Online-Abfrage geeignet, aber mit der richtigen Technik lässt sich da schon etwas machen - auch im Hinblick auf das nächste Redesign der web site, was ja bestimmt nicht ganz ausgeschlossen werden kann. Nachdenkliche Grüße |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
![]() MSHTML (oder auch ein anderer HTML-Parser) würde dir auch dies abnehmen. |
Re: Umlaute-Problem mit idHTTP.Get (Indy) => ö und Co.
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz