메뉴 건너뛰기

Dev tips

ASP UTF-8에서 URLEncode, URLDecode 구현

taknim 2011.04.02 21:12 조회 수 : 6771 추천:1434

http://www.cftea.com/c/2009/10/OOXX97QIONHANAF9.asp
<%
Function UrlEncode_GBToUtf8(ByVal str)
    Dim B                    ''??字符
    Dim ub                  ''中文字的Unicode?(2字?)
    Dim High8b, Low8b       ''Unicode?的高低位字?
    Dim UtfB1, UtfB2, UtfB3 ''Utf-8?的三?字?
    Dim i, s
    For i = 1 To Len(str)
        B=Mid(str, i, 1)
        ub = AscW(B)
        If (ub>=48 And ub<=57) Or (ub>=65 And ub<=90) Or (ub>=97 And ub<=122) Or ub=42 Or ub=45 Or ub=46 Or ub=64 Or ub=95 Then
            ''48 to 57代表0~9;65 to 90代表A~Z;97 to 122代表a~z
            ''42代表*;46代表.;64代表@;45代表-;95代表_
            s=s & B
        ElseIf ub=32 Then ''空格?成+
            s=s & "+"
        ElseIf ub<128 Then    ''低于128的Ascii?成1?字?
            s=s & "%" & Right("00" & Hex(ub),2)
        Else
            High8b = (ub And &HFF00) / &H100 ''Unicode?高位
            Low8b = ub And &HFF ''Unicode?低位
            UtfB1 = (High8b And &HF0) / &H10 Or &HE0 ''取Unicode高位字?的二?制的前4位 + 11100000
            UtfB2 = ((High8b And &HF) * &H4 + (Low8b And &HC0) / &H40) Or &H80 ''取Unicode高位字?的后4位及低位字?的前2位 +10000000
            UtfB3 = (Low8b And &H3F) Or &H80 ''取Unicode低位字?的二?制后6位 + 10000000
            s = s & "%" & Hex(UtfB1) & "%" & Hex(UtfB2) & "%" & Hex(UtfB3)
        End If
    Next
    UrlEncode_GBToUtf8 = s
End Function


''“?”-AscW("?")=27721(十?制)    01101100 01001001(二?制)     6C49(十六?制)
''?Gb2312??成Utf-8?(十六?制表示)的方法?,先用AscW?Gb2312??Unicode?(2字?),再''?Unicode?的二?制中的位按utf-8(3字?)模板???充 x 位:

''URL解?,Gb2312?面提交到Utf-8?面
Function UrlDecode_GBToUtf8(ByVal str)
    Dim B,ub    ''中文字的Unicode?(2字?)
    Dim UtfB    ''Utf-8??字?
    Dim UtfB1, UtfB2, UtfB3 ''Utf-8?的三?字?
    Dim i, n, s
    n=0
    ub=0
    For i = 1 To Len(str)
        B=Mid(str, i, 1)
        Select Case B
            Case "+"
                s=s & " "
            Case "%"
                ub=Mid(str, i + 1, 2)
                UtfB = CInt("&H" & ub)
                If UtfB<128 Then
                    i=i+2
                    s=s & ChrW(UtfB)
                Else
                    UtfB1=(UtfB And &H0F) * &H1000    ''取第1?Utf-8字?的二?制后4位
                    UtfB2=(CInt("&H" & Mid(str, i + 4, 2)) And &H3F) * &H40        ''取第2?Utf-8字?的二?制后6位
                    UtfB3=CInt("&H" & Mid(str, i + 7, 2)) And &H3F        ''取第3?Utf-8字?的二?制后6位
                    s=s & ChrW(UtfB1 Or UtfB2 Or UtfB3)
                    i=i+8
                End If
            Case Else    ''Ascii?
                s=s & B
        End Select
    Next
    UrlDecode_GBToUtf8 = s
End Function


Private Function UrlEncode_GBToUtf8_V2(szInput)
    Dim wch, uch, szRet
    Dim x
    Dim nAsc, nAsc2, nAsc3
    If szInput = "" Then
        UrlEncode_GBToUtf8_V2= szInput
        Exit Function
    End If
    For x = 1 To Len(szInput)
        wch = Mid(szInput, x, 1)
        nAsc = AscW(wch)
        If nAsc < 0 Then nAsc = nAsc + 65536
        If wch = "+" then
            szRet = szRet & "%2B"
        ElseIf wch = "%" then
            szRet = szRet & "%25"
        ElseIf (nAsc And &HFF80) = 0 Then
            szRet = szRet & wch
        Else
            If (nAsc And &HF000) = 0 Then
                uch = "%" & Hex(((nAsc \ 2 ^ 6)) Or &HC0) & Hex(nAsc And &H3F Or &H80)
                szRet = szRet & uch
            Else
                uch = "%" & Hex((nAsc \ 2 ^ 12) Or &HE0) & "%" & _
                Hex((nAsc \ 2 ^ 6) And &H3F Or &H80) & "%" & _
                Hex(nAsc And &H3F Or &H80)
                szRet = szRet & uch
            End If
        End If
    Next
    UrlEncode_GBToUtf8_V2= szRet
End Function


dim str
str = "1?a千一"
Response.Write(UrlEncode_GBToUtf8(str) & "<br />")
Response.Write(UrlDecode_GBToUtf8(UrlEncode_GBToUtf8(str)) & "<br />")
%>

결과

1%3Fa%E5%8D%83%E4%B8%80
1?a千一