URLs kodieren per VBA

URLs enthalten häufig Sonderzeichen, die von Internet-Browsern nicht interpretiert werden können. Dies können zum Beispiel Leerzeichen in HTML-Dateinamen oder Sonderzeichen in URL-Parametern sein. Sollen für den Zugriff auf eine REST-API Parameter an eine URL angehängt werden, die Sonderzeichen enthalten, müssen diese für den Browser lesbar gemacht werden. Dies geschieht durch die sogenannte URL-Kodierung, auch Encoding genannt. Dabei werden die betreffenden Zeichen durch ein Prozentzeichen gefolgt von einem numerischen Code für das jeweilige Zeichen ersetzt – für ein Leerzeichen zum Beispiel %20. Die Umwandlung solcher Zeichenketten erledigen wir mit einer VBA-Funktion, die wir in diesem Artikel vorstellen.

Die Regeln für die nachfolgend beschriebenen Funktionen sehen wir folgt aus:

  • Zahlen von 0-9, Buchstaben von a-z und Buchstaben von A-Z sollen beibehalten werden.
  • Die Sonderzeichen Minus (), Unterstrich (_), Punkt (.) und Tilde (~) sollen ebenfalls nicht enkodiert werden.
  • Alle anderen Zeichen sollen enkodiert werden.

Was genau heißt nun “enkodieren”? Es bedeutet, dass wir ein Zeichen wie beispielsweise ein Leerzeichen durch ein Prozentzeichen (%) und den ASCII-Code im hexadezimalen Format ersetzen. Das Leerzeichen hat den ASCII-Code 32, was hexadezimal 20 entspricht. Aus einem Leerzeichen wird also %20.

Man könnte meinen, wir kämen hier mit einer einfachen VBA-Funktion aus, welche untersucht, ob das Zeichen zu den nicht zu enkodierenden Zeichen gehört und die übrigen einfach in den entsprechenden Code umwandelt.

Das ist nicht der Fall, denn nicht alle auf diese Weise enkodierten Zeichen werden von Browsern und Webservices richtig interpretiert. Bei dem é in André beispielsweise liefert die Asc-Funktion den Wert 233, aber beispielsweise der REST-API des Dienstes lexoffice erwartet hier den Code %C3%A9 statt %E9 – mehr zu diesem Thema im Beitrag Zugriff auf lexoffice per Rest-API und VBA (www.access-im-unternehmen.de/1422).

Also verwenden wir eine etwas aufwendigere Funktion, die wie in Listing 1 aussieht. Um diese Funktion zu verwenden, benötigen wir noch einen Verweis auf die Bibliothek Microsoft ActiveX Data Objects 6.1 Library, den wir über den Verweise-Dialog des VBA-Editors hinzufügen (Menü-Eintrag Extras|Verweise).

Public Function URLEncode_UTF8(ByVal strURL As String) As String
     Dim bytes() As Byte
     Dim b As Byte
     Dim i As Long
     Dim strTemp As String
     If Len(strURL) > 0 Then
         With New ADODB.Stream
             .Mode = adModeReadWrite
             .Type = adTypeText
             .Charset = "UTF-8"
             .Open
             .WriteText strURL
             .Position = 0
             .Type = adTypeBinary
             .Position = 3
             bytes = .Read
         End With
         For i = 0 To UBound(bytes)
             b = bytes(i)
             Select Case b
                 Case 48 To 57, 65 To 90, 97 To 122, 45, 46, 95, 126
                     strTemp = strTemp & Chr(b)
                 Case 0 To 15
                     strTemp = strTemp & "%0" & Hex(b)
                 Case Else
                     strTemp = strTemp & "%" & Hex(b)
             End Select
         Next i
         URLEncode_UTF8 = strTemp
     End If
End Function

[

Listing 1: Die Funktion URLEncode_UTF8

Die Funktion URLEncode_UTF8 erwartet die zu enkodierende Zeichenkette und gibt das Ergebnis als String zurück. Sie prüft, ob die übergebene Zeichenkette eine Länge größer als 0 hat und erzeugt dann ein neues ADODB.Stream-Objekt. Eine wichtige Einstellung ist die des zu verwenden Zeichensatzes (UTF-8). Mit der WriteText-Methode schreiben wir die Zeichenkette in das Stream-Objekt.

Dabei erfolgt automatisch eine Wandlung der Zeichen in die entsprechenden Zahlencodes der jeweiligen Kodierung. Danach lesen wir den mit der Read-Methode ermittelten Inhalt des Stream-Objekts in ein Byte-Array ein. Dieses durchlaufen wir in einer For…Next-Schleife und weisen der Variablen b mit dem Datentyp Byte jeweils den Wert der aktuelle Position im Array bytes() zu. In einer Select Case-Bedingung untersuchen wir den Wert von b.

Hat dieser einen Wert, der einem der oben genannten, nicht zu enkodierenden Zeichen entspricht, fügen wir den mit Chr ermittelten Buchstaben für den jeweiligen Code an die Zeichenkette aus strTemp an.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar