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)


Оставить комментарий

Я не робот.