Função para codificar string para URL

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Função para codificar string para URL

Mensagem por bencz »

Boa tarde!
Alguem possui uma função para codificar strings para URL ?
Como exemplo, faz este site: http://meyerweb.com/eric/tools/dencoder/

Por exemplo, se entrar com a seguinte string
Hoje está um belo dia
A função retorne:
Hoje%20est%C3%A1%20um%20belo%20dia
Imagem
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Função para codificar string para URL

Mensagem por bencz »

Ok, resolvi o problema!
Encontrei um link contendo a 'tradução' de cada caractere http://www.utf8-chartable.de/

Código: Selecionar todos

static hValues

function main()
  **********
  hValues := { ;
    " " => "%20",;
  	"!" => "%21",;
  	'"' => "%22",;
  	"#" => "%23",;
  	"$" => "%24",;
  	"%" => "%25",;
  	"&" => "%26",;
  	"'" => "%27",;
  	"(" => "%28",;
  	")" => "%29",;
  	"*" => "%2a",;
  	"+" => "%2b",;
  	"," => "%2c",;
  	"-" => "%2d",;
  	"." => "%2e",;
  	"/" => "%2f",;
  	"0" => "%30",;
  	"1" => "%31",;
  	"2" => "%32",;
  	"3" => "%33",;
  	"4" => "%34",;
  	"5" => "%35",;
  	"6" => "%36",;
  	"7" => "%37",;
  	"8" => "%38",;
  	"9" => "%39",;
  	":" => "%3a",;
  	";" => "%3b",;
  	"<" => "%3c",;
  	"=" => "%3d",;
  	">" => "%3e",;
  	"?" => "%3f",;
  	"@" => "%40",;
  	"[" => "%5b",;
  	"\" => "%5c",;
  	"]" => "%5d",;
  	"^" => "%5e",;
  	"_" => "%5f",;
  	"`" => "%60",;
  	"{" => "%7b",;
  	"|" => "%7c",;
  	"}" => "%7d",;
  	"~" => "%7e",;
  	"¡" => "%c2%a1",;
  	"¢" => "%c2%a2",;
  	"£" => "%c2%a3",;
  	"¤" => "%c2%a4",;
  	"¥" => "%c2%a5",;
  	"¦" => "%c2%a6",;
  	"§" => "%c2%a7",;
  	"¨" => "%c2%a8",;
  	"©" => "%c2%a9",;
  	"ª" => "%c2%aa",;
  	"«" => "%c2%ab",;
  	"¬" => "%c2%ac",;
  	"­"	=> "%c2%ad",;
  	"®" => "%c2%ae",;
  	"¯" => "%c2%af",;
  	"°" => "%c2%b0",;
  	"±" => "%c2%b1",;
  	"²" => "%c2%b2",;
  	"³" => "%c2%b3",;
  	"´" => "%c2%b4",;
  	"µ" => "%c2%b5",;
  	"¶" => "%c2%b6",;
  	"·" => "%c2%b7",;
  	"¸" => "%c2%b8",;
  	"¹" => "%c2%b9",;
  	"º" => "%c2%ba",;
  	"»" => "%c2%bb",;
  	"¼" => "%c2%bc",;
  	"½" => "%c2%bd",;
  	"¾" => "%c2%be",;
  	"¿" => "%c2%bf",;
  	"À" => "%c3%80",;
  	"Á" => "%c3%81",;
  	"Â" => "%c3%82",;
  	"Ã" => "%c3%83",;
  	"Ä" => "%c3%84",;
  	"Å" => "%c3%85",;
  	"Æ" => "%c3%86",;
  	"Ç" => "%c3%87",;
  	"È" => "%c3%88",;
  	"É" => "%c3%89",;
  	"Ê" => "%c3%8a",;
  	"Ë" => "%c3%8b",;
  	"Ì" => "%c3%8c",;
  	"Í" => "%c3%8d",;
  	"Î" => "%c3%8e",;
  	"Ï" => "%c3%8f",;
  	"Ð" => "%c3%90",;
  	"Ñ" => "%c3%91",;
  	"Ò" => "%c3%92",;
  	"Ó" => "%c3%93",;
  	"Ô" => "%c3%94",;
  	"Õ" => "%c3%95",;
  	"Ö" => "%c3%96",;
  	"×" => "%c3%97",;
  	"Ø" => "%c3%98",;
  	"Ù" => "%c3%99",;
  	"Ú" => "%c3%9a",;
  	"Û" => "%c3%9b",;
  	"Ü" => "%c3%9c",;
  	"Ý" => "%c3%9d",;
  	"Þ" => "%c3%9e",;
  	"ß" => "%c3%9f",;
  	"à" => "%c3%a0",;
  	"á" => "%c3%a1",;
  	"â" => "%c3%a2",;
  	"ã" => "%c3%a3",;
  	"ä" => "%c3%a4",;
  	"å" => "%c3%a5",;
  	"æ" => "%c3%a6",;
  	"ç" => "%c3%a7",;
  	"è" => "%c3%a8",;
  	"é" => "%c3%a9",;
  	"ê" => "%c3%aa",;
  	"ë" => "%c3%ab",;
  	"ì" => "%c3%ac",;
  	"í" => "%c3%ad",;
  	"î" => "%c3%ae",;
  	"ï" => "%c3%af",;
  	"ð" => "%c3%b0",;
  	"ñ" => "%c3%b1",;
  	"ò" => "%c3%b2",;
  	"ó" => "%c3%b3",;
  	"ô" => "%c3%b4",;
  	"õ" => "%c3%b5",;
  	"ö" => "%c3%b6",;
  	"÷" => "%c3%b7",;
  	"ø" => "%c3%b8",;
  	"ù" => "%c3%b9",;
  	"ú" => "%c3%ba",;
  	"û" => "%c3%bb",;
  	"ü" => "%c3%bc",;
  	"ý" => "%c3%bd",;
  	"þ" => "%c3%be",;
  	"ÿ" => "%c3%bf" }
  **********
  
  ? EncodeHTML('Hoje está um belo dia')
  
return nil

function EncodeHTML(cText)
  local cResult := ''
  local c := ''
  
  for each c in cText
    if HHasKey(hValues, c)
      cResult += HGet(hValues, c)
    else
      cResult += c
    endif
  next
return cResult
Imagem
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Função para codificar string para URL

Mensagem por Claudio Soto »

Es muy sencillo desarrollar una función general:

1) la url debe estar codificada en utf-8, hb esto es sencillo StrToUtf8()

2) luego se va leyendo la cadena carácter por carácter (byte por byte), si el valor del byte es < 127 y > 32 queda como esta de lo contrario se lo sustituye por %xx donde xx es el valor en hexadecimal del byte

3) existen algunos caracteres especiales por debebajo de 127 que igual tienen que ir codificado en la forma anterior %xx

espacio %20
? %3f
& %26
% %25
# %23
/ %2f
< %3c
> %3e
: %3a
/ %2f
| %7c
; %3b

B) Existe una versión más estricta que el algoritmo anterior (más recomendada), y todo lo que no sea caracteres:
A-Z
a-z
0-9
- _ . ! ~ * ' ( )
se codifica con %xx

C)existe otra versión muy sencilla que consiste en codificar todos los bytes con %xx independiente del valor del byte

PD: todos los caracteres por debajo de 127 corresponden a los caracteres de la tabla ASCII
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Função para codificar string para URL

Mensagem por Claudio Soto »

Aquí les dejo una rutina general para codificar url.

Código: Selecionar todos

FUNCTION EncodeURL( cUrl )
LOCAL i, ch, cRet := ""
LOCAL Str := cUrl 

IF .NOT. hb_StrToUTF8( cUrl )
   Str := hb_StrToUTF8( cUrl )
ENDIF

FOR i := 1 TO Len( Str )
   ch := SubStr( Str, i, 1 ) 
   IF ( ch >= 'A' .AND. ch <= 'Z' ) .OR. ( ch >= 'a' .AND. ch <= 'z' ) .OR. ( ch >= '0' .AND. ch <= '9' ) .OR. ( ch $ "-_.!~*'()"
      cRet := cRet + ch
   ELSE
      cRet := cRet + '%' + hb_StrToHex( ch )
   ENDIF
NEXT

RETURN cRet

PD: No la probé porque la escribí directo del celular, favor verificar que no haya quedado ningún espacio en blanco entre las comillas.
Los espacios en blanco en las url también se pueden codificar con el signo de más '+'
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Responder