Categorias

Função URLDecode para Decodificar uma URL Codificada

Com esta função é possível converter uma string contendo uma URL Codificada “URLEncoded” por uma URL Decodificada “URLDecoded“. Uma URL Decodificada é representada por caracteres da tabela US-ASCII.

As regras para a formação de uma URLDecoded são descritas no documento Internet Standards:

RFC 1738 – Uniform Resource Locators (URL)

A função URLDecode substitui todas as ocorrências do caractere ‘+’ por ‘ ‘ (espaço). A função também lê qualquer valor representado com um triplo hexadecimal, que consiste no caractere ‘%’ seguido de 2 dígitos hexadecimais, a função converte esses dígitos no caractere equivalente da tabela US-ASCII.

A função URLEncode já é nativa do ASP e pode ser encontrada no objeto Server, porém para Decodificar a URL é preciso utilizar uma função externa (como esta).

Veja um exemplo de como pode ser representado uma URL Codificada e como ficará após a utilização da função URLDecode.

Codificada:
http%3A%2F%2Fwww%2Ecodigofonte%2Ecom%2Ebr%2Fpagina%2Easp%3Fparametro1%3DC%F3digo+Fonte%26parametro2%3DO+melhor+conte%FAdo+para+programadores

Decodificada:
https://www.codigofonte.com.br/pagina.asp?parametro1=Código Fonte&parametro2=O melhor conteúdo para programadores

<%
'-----------------------------------------------------
'Nome: URLDecode(ByVal Texto)
'Tipo: Funcao
'Sinopse: Faz um URL Decode em uma String
'Parametros:
'   Texto: Texto com a URL
'Retorno: String
'Autor: Gabriel Fróes - www.codigofonte.com.br
'-----------------------------------------------------
Function URLDecode(ByVal Texto)
	On Error Resume Next
	
	'Declarações
	Dim Posicao
	Dim Posicao2
	Dim objStream
	Dim Retorno

	'Substitui '+' por espaço
	Texto = Replace(Texto, "+", " ")

	'...........................................
	'Utilizando ADODB.Stream (caso seja possível)
	'...........................................
	Set objStream = Server.CreateObject("ADODB.Stream")
	If Err = 0 Then
	    On Error Goto 0
	    objStream.Type = 2 'String
	    objStream.Open

	    'Substitui todos %(chars) pelos caracteres correspondentes
	    Posicao = InStr(1, Texto, "%")
	    Posicao2 = 1
	    Do While Posicao > 0
			objStream.WriteText Mid(Texto, Posicao2, Posicao - Posicao2) + Chr(CLng("&H" & Mid(Texto, Posicao + 1, 2)))
			Posicao2	= Posicao + 3
			Posicao		= InStr(Posicao2, Texto, "%")
	    Loop
	    objStream.WriteText Mid(Texto, Posicao2)

	    'Lendo o texto do objeto stream
	    objStream.Position = 0
	    Retorno = objStream.ReadText

	    'Libera o objeto
	    objStream.Close
	    
		'Destruindo o objeto
		Set objStream = Nothing
	'...........................................
	'Com este método a varredura dos dados é mais lenta e não é recomendável para
	'strings com mais de 100kb.
	'...........................................
	Else
		On Error Goto 0
	    Posicao = InStr(1, Texto, "%")
		Do While Posicao>0 
			Texto = Left(Texto, Posicao - 1) + Chr(Clng("&H" & Mid(Texto, Posicao + 1, 2))) + Mid(Texto, Posicao + 3)
			Posicao = InStr(Posicao + 1, Texto, "%")
	    Loop
	    Retorno = Texto
	End If
	  
	'Retornando a função
	URLDecode = Retorno 
End Function
%>