ASP URL编码及反编码函数实现

asp中对url处理的功能不够完善。server.urlencode用起来不方便。而且没有提供decode方法(.net中有)

所以,很多有此需求的人都自己写了相关的方法实现。下面是我的实现代码

先说明一下:

一、编码的时候只作ascii编码,但解码时考虑了unicode编码(%u起头的),类似js中的unescape

二、最后一个函数是将十六进制转换成十进制的方法。也是本人原创。

其实这个功能很容易实现,方法也很多,但我觉得这个方法无论从性能还是安全性上都是最好的。

网上流传最广的是eval("&H" & str)这种转换。就本人测试的性能来讲,和dHex函数相差无几,但安全性就不够了。

比如,字符串中混入了a-f以外的字符,那么eval就会出错.如果字符串是接收来的,必须经过过滤才行,否则,有很大的安全隐患。

而这个dHex会将字符串中除了1-f以外的字符全部视为0,保证最后返回的是数字.

有点跑题了。上代码

'测试内容,使用了unicode编码.普通编码一样通用
a="%u592E%u4EA7%u623F%uFF0C%u5DF2%u7ECF%u53EF%u4EE5%u4E0A%u5E02%u3002%u4EA4%u901A%u4FBF%u5229%uFF0C"
Response.Write URLDecode(a)

'******************************
'函数:URLEncode(strURL)
'参数:str 要编码或解码的字符
'作者:白雨临风
'日期:2011/8/18
'描述:URL编码及反编码函数
'示例:URLEncode(strURL)
'update:2011/11/10
'增加%u格式解码
'******************************
Function URLEncode( strURL) 
	Dim I, x, l, cArr()
	l	= Len(strURL)
	ReDim cArr(l)
	
	For I = 1 To l
		x=Asc(Mid(strURL, I, 1))
		If x < 0 Then 
			x=CStr(Hex(x))
			cArr(I)	=  "%" & Left(x, Len(x) - 2) & "%" & Right(x, 2)
		ElseIf (x >= 65 And x <= 90) Or (x >= 97 And x <= 122) Then 
			cArr(I) = Chr(x)
		Else 
			cArr(I) = "%" & Hex(x)
		End If 
	Next
	URLEncode = Join(cArr,"")
End Function 
 
Function URLDecode( strURL) 
	Dim I, l, x, dStr, u
	l	= Len(strURL)
	
	For I = 1 To l
		x=Mid(strURL, I, 1)
		If x = "%" Then
			u=Mid(strURL, I + 1, 1)
			If u="u" Then
				x=Mid(strURL, I + 2, 4)
				dStr = dStr & Chrw(dHex(x)) 
				I = I + 5 
			Else
				x=Mid(strURL, I + 1, 2)
				If dHex(x) > 127 Then 
					dStr = dStr & Chr(dHex(x & Mid(strURL, I + 4, 2))) 
					I = I + 5 
				Else 
					dStr = dStr & Chr(dHex(x)) 
					I = I + 2 
				End If
			End If
		Else 
			dStr = dStr & x
		End If
	Next 
	
	URLDecode = dStr
End Function

'十六进制转换十进制函数
Const HEX_MAP	= "123456789ABCDEF"
Function dHex( strin) 
	Dim i, result, l
	l		= Len(strin)
	result	= 0
	For i = 1 To l
		result = result + InStr(HEX_MAP,Mid(strin, i, 1))*(16^(l-i))
	Next 
	dHex = result
End Function