Sonderzeichen korrekt grabben mit XmlHttp
Geschrieben von: Christoph Wille Manches Mal kommt man sich als Entwickler für nicht-englische Sites leicht verlassen vor, da viel Software nur auf Englisch als Sprache ausgerichtet zu sein scheint. Und darunter fällt auch, daß in vielen Fällen die von uns Deutschsprachigen so geliebten Sonderzeichen (Umlaute und dergleichen) des öfteren scheint's "verschluckt" werden - wie zum Beispiel beim Seitengrabbing mit der XmlHttp Komponente des MSXML Parsers. Für den heutigen Artikel habe ich den MSXML Parser 4.0 verwendet. Dieser kann von MSDN Microsoft XML Core Services 4.0 RTM downgeloadet werden. Um zu zeigen, was ich mit "verschlucken" von Sonderzeichen meine, habe ich eine sehr minimale Seite (demo.asp) geschrieben, die einige Umlaute beinhaltet: <html> <head><title>Demoseite</title> </head> <body> <p> Altötting bei München </p> </body> </html> Im Normalfall versucht man es mit der kürzest möglichen Variante, wie schon im Artikel Webpage-Grabbing mit dem XML Parser demonstriert. Ich habe den Code in die Datei grabplain.vbs verpackt, um ausnahmsweise auf der Kommandozeile testen zu können (eine entsprechend programmierte ASP Seite ist im Download auch vorhanden): Dim objXmlHttp Set objXmlHttp = CreateObject("MSXML2.ServerXMLHTTP.4.0") objXmlHttp.open "GET", "http://127.0.0.1/aspheute/xmlhttp/demo.asp", False objXmlHttp.send Wscript.Echo objXmlHttp.responseBody Set objXmlHttp = Nothing Nun, der Output enthält verdächtig viele Fragezeichen: die zurückgelieferte Response wird definitiv mit dem falschen Zeichensatz interpretiert. Die nächste Sektion zeigt, wie man es lösen kann. Richtig mit Character SetWer denkt, eine einfache Einstellung am XmlHttp Objekt selbst hilft, irrt in diesem Falle leider. Man muß sich des Stream Objekts von ADO bedienen, das eine Zeichensatzkonvertierung beherrscht. Der entsprechende Sourcecode sieht dann so aus (grabumlauts.asp, eine VBS Datei ist im Download mit dabei): <% @Language=VBScript %> <% Option Explicit Const adTypeText = 2 Const adReadAll = -1 Dim objXmlHttp, objStream Set objXmlHttp = Server.CreateObject("MSXML2.ServerXMLHTTP.4.0") objXmlHttp.open "GET", "http://127.0.0.1/aspheute/xmlhttp/demo.asp", False objXmlHttp.send Set objStream = Server.CreateObject("ADODB.Stream") objStream.Open objStream.Type = adTypeText objStream.WriteText (objXmlHttp.responseBody) objStream.Position = 0 objStream.Charset = "latin1" Response.Write objStream.ReadText(adReadAll) objStream.close Set objStream = Nothing Set objXmlHttp = Nothing %> Der Code zum Grabben der Seite ist gleich geblieben, was dazugekommen ist ist das Stream Objekt. Diesem wird der gegrabbte Inhalt übergeben (mittels WriteText), und nach dieser Übergabe gehen wir wieder an den Anfang des Streams (Position=0). Und der interessanteste Part ist dann objStream.Charset = "latin1". Hier wird das Character Set (Zeichensatz) eingestellt, mit dem die geschriebenen Daten wieder ausgelesen werden sollen, was für unseren Kulturkreis latin1 ist. Nach dieser Einstellung kann der korrekt konvertierte Text mittels ReadText ausgelesen werden, und wir haben statt Sonderzeichen unsere Umlaute erhalten (gilt auch für andere Sonderzeichen). Wie findet man heraus, welche Einstellungen man für Charset treffen kann? Eine Variante ist die Registry: Unter HKCR\MIME\Database\Charset findet sich eine Auflistung der Charsets. Wer nicht gerne in der Registry herumsucht, kann sich auch in der MSDN schlau machen: Character Set Recognition. SchlußbemerkungWie man sieht ist die ADODB.Stream Klasse nicht nur im Kontext von Datenbanken ein äußerst praktischer Gehilfe. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Kopieren verboten - Lizenzsicherung bei ASP Scripts Links zu anderen Sites
Character Set Recognition Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |