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