LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

ASP中只有UrlEncode,没有Urldecode问题的解决方法?

admin
2022年6月21日 15:15 本文热度 768

在ASP中传递参数时有一个很有用的系统函数Server.UrlEncode,可以将一些非字母数字的特殊符号转换成标准URL编码(其实就是16进制ASC码),这样就解决了参数传递问题,然后我以为也提供了Server.UrlDecode,但使用后却发现程序报错,原来系统并没有提供这个我想象中的解码函数。怎幺办,自己动手吧。

UrlEncode的原理其实很简单,就是将特殊字符转换成16进制ASC码值,那么译码函数就只要将16进制ASC转回对应的字符就OK了。

Function URLDecode(enStr)                    'URL解码函数

  dim deStr

  dim c,i,v

  deStr=""

  for i=1 to len(enStr)

    c=Mid(enStr,i,1)

    if c="%" then

      v=eval("&h"+Mid(enStr,i+1,2))

      if v<128 then

        deStr=deStr&chr(v)

        i=i+2

      else

        if isvalidhex(mid(enstr,i,3)) then

          if isvalidhex(mid(enstr,i+3,3)) then

            v=eval("&h"+Mid(enStr,i+1,2)+Mid(enStr,i+4,2))

            deStr=deStr&chr(v)

            i=i+5

          else

            v=eval("&h"+Mid(enStr,i+1,2)+cstr(hex(asc(Mid(enStr,i+3,1)))))

            deStr=deStr&chr(v)

            i=i+3

          end if

        else

          destr=destr&c

        end if

      end if

    else

      if c="+" then

        deStr=deStr&" "

      else

        deStr=deStr&c

      end if

    end if

  next

  URLDecode=deStr

end function


function isvalidhex(str)

  isvalidhex=true

  str=ucase(str)

  if len(str)<>3 then isvalidhex=false:exit function

  if left(str,1)<>"%" then isvalidhex=false:exit function

  c=mid(str,2,1)

  if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function

  c=mid(str,3,1)

  if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function

end function

经测试gb312格式的asp使用没有问题。

下面是另外一种方法,如果上面的方法出错,那么就用下面这个试试:

Function URLDecode(ByVal urlcode)                    'URL解码函数

Dim start,final,length,char,i,butf8,pass

Dim leftstr,rightstr,finalstr

Dim b0,b1,bx,blength,position,u,utf8

On Error Resume Next

b0 = Array(192,224,240,248,252,254)

urlcode = Replace(urlcode,"+"," ")

pass = 0

utf8 = -1

length = Len(urlcode) : start = InStr(urlcode,"%") : final = InStrRev(urlcode,"%")

If start = 0 Or length < 3 Then URLDecode = urlcode : Exit Function

leftstr = Left(urlcode,start - 1) : rightstr = Right(urlcode,length - 2 - final)

For i = start To final

char = Mid(urlcode,i,1)

If char = "%" Then

bx = URLDecode_Hex(Mid(urlcode,i + 1,2))

If bx > 31 And bx < 128 Then

i = i + 2

finalstr = finalstr & ChrW(bx)

ElseIf bx > 127 Then

i = i + 2

If utf8 < 0 Then

butf8 = 1 : blength = -1 : b1 = bx

For position = 4 To 0 Step -1

If b1 >= b0(position) And b1 < b0(position + 1) Then

blength = position

Exit For

End If

Next

If blength > -1 Then

For position = 0 To blength

b1 = URLDecode_Hex(Mid(urlcode,i + position * 3 + 2,2))

If b1 < 128 Or b1 > 191 Then butf8 = 0 : Exit For

Next

Else

butf8 = 0

End If

If butf8 = 1 And blength = 0 Then butf8 = -2

If butf8 > -1 And utf8 = -2 Then i = start - 1 : finalstr = "" : pass = 1

utf8 = butf8

End If

If pass = 0 Then

If utf8 = 1 Then

b1 = bx : u = 0 : blength = -1

For position = 4 To 0 Step -1

If b1 >= b0(position) And b1 < b0(position + 1) Then

blength = position

b1 = (b1 xOr b0(position)) * 64 ^ (position + 1)

Exit For

End If

Next

If blength > -1 Then

For position = 0 To blength

bx = URLDecode_Hex(Mid(urlcode,i + 2,2)) : i = i + 3

If bx < 128 Or bx > 191 Then u = 0 : Exit For

u = u + (bx And 63) * 64 ^ (blength - position)

Next

If u > 0 Then finalstr = finalstr & ChrW(b1 + u)

End If

Else

b1 = bx * &h100 : u = 0

bx = URLDecode_Hex(Mid(urlcode,i + 2,2))

If bx > 0 Then

u = b1 + bx

i = i + 3

Else

If Left(urlcode,1) = "%" Then

u = b1 + Asc(Mid(urlcode,i + 3,1))

i = i + 2

Else

u = b1 + Asc(Mid(urlcode,i + 1,1))

i = i + 1

End If

End If

finalstr = finalstr & Chr(u)

End If

Else

pass = 0

End If

End If

Else

finalstr = finalstr & char

End If

Next

URLDecode = leftstr & finalstr & rightstr

End Function


Function URLDecode_Hex(ByVal h)

On Error Resume Next

h = "&h" & Trim(h) : URLDecode_Hex = -1

If Len(h) <> 4 Then Exit Function

If isNumeric(h) Then URLDecode_Hex = cInt(h)

End Function

下面又是一种算法:

1.  function URLDecode(strIn)

2.      URLDecode = ""

3.      Dim sl: sl = 1

4.      Dim tl: tl = 1

5.      Dim key: key = "%"

6.      Dim kl: kl = Len(key)

7.   

8.      sl = InStr(sl, strIn, key, 1)

9.      Do While sl>0

10.        If (tl=1 And sl<>1) Or tl<sl Then

11.            URLDecode = URLDecode & Mid(strIn, tl, sl-tl)

12.        End If

13.

14.        Dim hh, hi, hl

15.        Dim a

16.        select Case UCase(Mid(strIn, sl+kl, 1))

17.            Case "U":                  'Unicode URLEncode

18.            a = Mid(strIn, sl+kl+1, 4)

19.            URLDecode = URLDecode & ChrW("&H" & a)

20.            sl = sl + 6

21.

22.            Case "E":                   'UTF-8 URLEncode

23.            hh = Mid(strIn, sl+kl, 2)

24.            a = Int("&H" & hh)          'ascii

25.            If Abs(a)<128 Then

26.                sl = sl + 3

27.                URLDecode = URLDecode & Chr(a)

28.            Else

29.                hi = Mid(strIn, sl+3+kl, 2)

30.                hl = Mid(strIn, sl+6+kl, 2)

31.                a = ("&H" & hh And &H0F) * 2 ^12 Or ("&H" & hi And &H3F) * 2 ^ 6 Or ("&H" & hl And &H3F)

32.                If a<0 Then a = a + 65536

33.                URLDecode = URLDecode & ChrW(a)

34.                sl = sl + 9

35.            End If

36.        Case Else:                      'Asc URLEncode

37.            hh = Mid(strIn, sl+kl, 2)   '高位

38.            a = Int("&H" & hh)          'ascii

39.            If Abs(a)<128 Then

40.            sl = sl + 3

41.            Else

42.            hi = Mid(strIn, sl+3+kl, 2) '低位

43.            a = Int("&H" & hh & hi)     'ascii

44.            sl = sl + 6

45.            End If

46.            URLDecode = URLDecode & Chr(a)

47.        End select

48.

49.        tl = sl

50.        sl = InStr(sl, strIn, key, 1)

51.    Loop

52.

53.    URLDecode = URLDecode & Mid(strIn, tl)

54.End function


该文章在 2023/10/23 11:16:21 编辑过

全部评论1

admin
2023年10月23日 11:19

 又一种算法:

Public Function URLDecode(ByVal data, ByVal charset)

   Dim strm

   Set strm = Server.createObject("ADODB.Stream")

   With strm

   .type = 2

   .charset = "iso-8859-1"

   .open

   .writeText unescape(data)

   .position = 0

  .charset = charset

  URLDecode = .readText(-1)

  .close

  End With

  Set strm = Nothing

End Function


Response.Write URLDecode("%B4%F3%BC%D2%BA%C3%B0%A1", "GB2312") & "<br/>"

Response.Write URLDecode("%E5%A4%A7%E5%AE%B6%E5%A5%BD%E5%95%8A", "UTF-8") & "<br/>"

Response.Write URLDecode("http%3A%2F%2Fwww.dangdang.com%2F", "UTF-8") & "<br/>"


该评论在 2023/10/23 11:21:55 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved