URLs kodieren per VBA

URLs enthalten oft Sonderzeichen, die von Internetbrowsern nicht interpretiert werden können. Dabei handelt es sich beispielsweise um Leerzeichen in den Namen von HTML-Dateien oder auch um Sonderzeichen in den Parametern einer URL. Wenn wir zum Beispiel für den Zugriff auf eine REST-API Parameter zu einer URL hinzufügen wollen, die Sonderzeichen enthalten, müssen wir diese für den Browser lesbar machen. Das geschieht durch die sogenannte URL-Kodierung, auch Encoding genannt. Dabei ersetzt man die betroffenen Zeichen durch ein Prozentzeichen gefolgt von einem Zahlencode für das jeweilige Zeichen – bei einem Leerzeichen beispielsweise %20. Die Umwandlung solcher Zeichenketten erledigen wir mit einer VBA-Funktion, die wir im vorliegenden Beitrag 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 Integer
     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

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar