23
Октябрь
2009
URL Encoding. Ascii-вариант
URL Encoding. Ascii-вариант
Public Function URLEncode_Ascii(ByVal plain_text As String) As String
Dim i As Long, ts As String, cur_char As Byte
Dim reserved_symbols_allowed As String, unreserved_symbols As String
Static flagTableInited As Boolean
Static ascii_map(0 To 255) As String
If Not flagTableInited Then
' Незарезервированные символы.
' Символы допустимые в URL
unreserved_symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~"
For i = 1 To Len(unreserved_symbols)
ascii_map(Asc(Mid$(unreserved_symbols, i, 1))) = Mid$(unreserved_symbols, i, 1)
Next i
' Зарезервированные символы: !*'();:@&=+$,/?%#[] и пробел
' Спецсимволы которые не должны появляться в URI.
' Но в зависимости от контекста некоторые из них могут быть разрешены и не должны быть закодированы
reserved_symbols_allowed = ""
For i = 1 To Len(reserved_symbols_allowed)
ascii_map(Asc(Mid$(reserved_symbols_allowed, i, 1))) = Mid$(reserved_symbols_allowed, i, 1)
Next i
' Все остальные символы
For i = 0 To 255
If i < 16 Then
ascii_map(i) = "%0" & Hex$(i)
Else
If Len(ascii_map(i)) = 0 Then ascii_map(i) = "%" & Hex$(i)
End If
Next i
flagTableInited = True
End If
For i = 1 To Len(plain_text)
ts = ts & ascii_map(Asc(Mid$(plain_text, i, 1)))
Next i
URLEncode_Ascii = ts
End Function
Public Function URLDecode_Ascii(ByVal urlencoded_text As String) As String
Dim i As Long, ts As String
i = 1
For i = 1 To Len(urlencoded_text)
If Asc(Mid$(urlencoded_text, i, 1)) = Asc("%") Then
If i + 2 <= Len(urlencoded_text) Then
ts = ts & Chr$(Val("&h" & Mid$(urlencoded_text, i + 1, 2)))
i = i + 2
Else
' Ошибка. Кривая строка
End If
Else
ts = ts & Mid$(urlencoded_text, i, 1)
End If
Next i
URLDecode_Ascii = ts
End Function
Пример использования:
Dim URL As String, URL_coded As String URL = "абв" URL_coded = URLEncode_Ascii(URL) MsgBox URL_coded & vbCrLf & URLDecode_Ascii(URL_coded)