Communauté Eggdrop
Décoder une chaîne de caractères contenue dans une url - Version imprimable

+- Communauté Eggdrop (https://forum.eggdrop.fr)
+-- Forum : Eggdrop et TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=8)
+--- Forum : Bouts de Scripts (https://forum.eggdrop.fr/forumdisplay.php?fid=17)
+--- Sujet : Décoder une chaîne de caractères contenue dans une url (/showthread.php?tid=1420)



Décoder une chaîne de caractères contenue dans une url - CrazyCat - 07/10/2013

Voici le pendant de la fonction urlencode, bien que l'intérêt de son utilisation me semble très réduit.

Il s'agit d'une simple inversion du tableau présent dans la procédure.

tcl
proc ::urldecode {data} {
   return [::tcl::string::map {
      "%20" " " "%22" "\"" "%23" "#" "%24" "$" "%25" "%"
      "%26" "&" "%27" "'" "%28" "\(" "%29" "\)" "%2A" "*"
      "%2B" "+" "%2C" "," "%2E" "." "%2F" "\/" "%3A" ":"
      "%3B" ";" "%3C" "<" "%3D" "=" "%3E" ">" "%3F" "?"
      "%40" "@" "%5B" "\[" "%5C" "\\" "%5D" "\]" "%5E" "^"
      "%7B" "\{" "%7C" "|" "%7D" "\}" "%7E" "~" "%A1" "¡"
      "%A2" "¢" "%A3" "£" "%A4" "¤" "%A5" "¥" "%A6" "¦"
      "%A7" "§" "%A8" "¨" "%A9" "©" "%AA" "ª" "%AB" "«"
      "%AC" "¬" "%AD" "­" "%AE" "®" "%AF" "¯" "%B0" "°"
      "%B1" "±" "%B2" "²" "%B3" "³" "%B4" "´" "%B5" "µ"
      "%B6" "¶" "%B7" "·" "%B8" "¸" "%B9" "¹" "%BA" "º"
      "%BB" "»" "%BC" "¼" "%BD" "½" "%BE" "¾" "%BF" "¿"
      "%C0" "À" "%C1" "Á" "%C2" "Â" "%C3" "Ã" "%C4" "Ä"
      "%C5" "Å" "%C6" "Æ" "%C7" "Ç" "%C8" "È" "%C9" "É"
      "%CA" "Ê" "%CB" "Ë" "%CC" "Ì" "%CD" "Í" "%CE" "Î"
      "%CF" "Ï" "%D0" "Ð" "%D1" "Ñ" "%D2" "Ò" "%D3" "Ó"
      "%D4" "Ô" "%D5" "Õ" "%D6" "Ö" "%D7" "×" "%D8" "Ø"
      "%D9" "Ù" "%DA" "Ú" "%DB" "Û" "%DC" "Ü" "%DD" "Ý"
      "%DE" "Þ" "%DF" "ß" "%E0" "à" "%E1" "á" "%E2" "â"
      "%E3" "ã" "%E4" "ä" "%E5" "å" "%E6" "æ" "%E7" "ç"
      "%E8" "è" "%E9" "é" "%EA" "ê" "%EB" "ë" "%EC" "ì"
      "%ED" "í" "%EE" "î" "%EF" "ï" "%F0" "ð" "%F1" "ñ"
      "%F2" "ò" "%F3" "ó" "%F4" "ô" "%F5" "õ" "%F6" "ö"
      "%F7" "÷" "%F8" "ø" "%F9" "ù" "%FA" "ú" "%FB" "û"
      "%FC" "ü" "%FD" "ý" "%FE" "þ" "%FF" "ÿ"
   } $data]
}



source éditable


RE: urldecode - MenzAgitat - 07/10/2013

 
Je propose une alternative que je viens de bricoler vite fait :
tcl
proc ::urldecode {data} {
	return [subst -novariables -nobackslashes [regsub -nocase -all {%([0-9a-f]{2})} $data "\[binary format H* \\1\]"]]
}



elle a l'avantage de dispenser d'avoir un tableau volumineux et peut-être incomplet, mais a peut-être des inconvénients auxquels je ne pense pas dans l'immédiat.


RE: urldecode - CrazyCat - 07/10/2013

Petit ajout: il faut penser à décoder aussi les caractères valides dans une url, comme le + :
tcl
proc ::urldecode {data} {
   set data [::tcl::string::map { "+" "%20" } $data]
   return [subst -novariables -nobackslashes [regsub -nocase -all {%([0-9a-f]{2})} $data "\[binary format H* \\1\]"]]
}


Je passe par un string::map parce que ce n'est surement pas le seul caractère qui n'est pas obligatoirement en hexa, et je transforme en code hexa par souci d'uniformisation.


RE: urldecode - MenzAgitat - 07/10/2013

 
Bien vu CrazyCat.
Petite optimisation pour la rapidité d'exécution :

tcl
proc ::urldecode {data} {
	return [::tcl::string::map {"+" " "} [subst -novariables -nobackslashes [regsub -all {%([0-9a-fA-F]{2})} $data "\[binary format H* \\1\]"]]]
}




Avant :
Citation :<MenzAgitat> .tcl time {::testurldecode1 "ceci+est+un%20t%c5%FFst+ceci+est+un+test+ceci+est+un+test+ceci+est+un+test+ceci+est+un+test"} 10000
<Boole> Tcl: 163.6093 microseconds per iteration
Après :
Citation :<MenzAgitat> .tcl time {::testurldecode2 "ceci+est+un%20t%c5%FFst+ceci+est+un+test+ceci+est+un+test+ceci+est+un+test+ceci+est+un+test"} 10000
<Boole> Tcl: 30.8018 microseconds per iteration