ASP中只有UrlEncode,没有Urldecode问题的解决方法?
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
在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 编辑过
|
关键字查询
相关文章
正在查询... |