Página 1 de 1

Função para codificar string para URL

Enviado: 02 Fev 2017 14:39
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

Função para codificar string para URL

Enviado: 02 Fev 2017 15:17
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

Função para codificar string para URL

Enviado: 02 Fev 2017 16:25
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

Função para codificar string para URL

Enviado: 03 Fev 2017 10:31
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 '+'