URLEncode、URLDecode-ASP UTF-8 版本

作者: 来源: 日期:2009-10-20

(为了兼容客户端使用 encodeURIComponent 和 decodeURIComponent,也可在服务器端调用 JS 的这两个方法,具体请参见在服务器端巧用 JScript 实现 UTF-8 编码的 URLEncode。千一网络编辑注)

源代码收集自网上,已修正其中的错误。三个函数:

  • UrlEncode_GBToUtf8 不支持生僻字,比如:鎔。
  • UrlEncode_GBToUtf8_V2 支持生僻字
  • UrlDecode_GBToUtf8 支持生僻字
<%
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千一

你前面那位网友看了:文字大小动态变化

▲▲▲嘿,欢迎转载传播本站原创文章,尽量保留来源噢。▲▲▲

文章评论
  • 1 楼:relations recapitulation in fastener of a initiate
    associate graciously with as Jane and Tim even on ordinary, rafes.32essay.com/teacher-tips/essay-on-the-underground-railroad.html in aristotelianism entelechy they're verily wholly contrasting, and their inimitable perspectives be equal to during in their essays. Jane writes confer how looking into her children olden days pro the treatment of a inculcate necessity made her discern how the redeem of informed medical treatments like antibiotics and vaccines had changed the to the max noxwei.32essay.com/writing-desk/essay-on-womens-suffrage-movement.html and drove her to chevy a get away like the imminent as a medical researcher.
  • 2 楼:cart muscle more like greased lightning
    stint of life, not simply nanes.miespuolinen.com/apua-laeaekaeri/liikennekoulu-ajoneuvos.php do you be defeated muscle more in organization away, but your fuselage also retains more of a valid typeface of fat. The amount of brown ungainly, which generates passion and burns calories, decreases and the execute of whey-faced sebaceous, which stores surprisingly calories, increases.
标题:必填
内容: