Décoder une chaîne de caractères contenue dans une url
#1
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
Répondre
#2
 
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.
Répondre Avertir
#3
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.
Répondre
#4
 
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
 
Répondre Avertir


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté