Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Sonderzeichen korrekt grabben mit XmlHttp

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.

Richtig mit Character Set

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.

Schlußbemerkung

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

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20011113.zip

Verwandte Artikel

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

Links zu anderen Sites

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.