Geschrieben von: Christoph Wille
Kategorie: Komponenten
This printed page brought to you by AlphaSierraPapa
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.
Wer 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.
Wie man sieht ist die ADODB.Stream Klasse nicht nur im Kontext von Datenbanken ein äußerst praktischer Gehilfe.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20011113.zip
Kopieren verboten - Lizenzsicherung bei ASP Scripts
http:/www.aspheute.com/artikel/20020411.htm
Laden von Dateien aus dem Web mit ASP
http:/www.aspheute.com/artikel/20000519.htm
Meta Tags von fremden Seiten parsen
http:/www.aspheute.com/artikel/20010803.htm
Scrapen von Webseiten
http:/www.aspheute.com/artikel/20000824.htm
Speichern von Recordsets in Application-Variablen (Teil II)
http:/www.aspheute.com/artikel/20000425.htm
Webpage-Grabbing mit dem XML Parser
http:/www.aspheute.com/artikel/20010328.htm
Webseiten automatisiert scrapen
http:/www.aspheute.com/artikel/20010910.htm
Webseiten automatisiert scrapen, Teil 2
http:/www.aspheute.com/artikel/20010911.htm
Character Set Recognition
http://msdn.microsoft.com/library/default.asp?url=/workshop/Author/dhtml/reference/charsets/charset4.asp
Microsoft XML Core Services 4.0 RTM
http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/001/766/msdncompositedoc.xml
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.