Az URL-kódolás dekódolása (százalékos kódolás)

Szeretném dekódolni az URL-kódolást, van-e valamilyen beépített eszköz erre, vagy bárki megadhatna nekem egy sed kód, amely ezt meg fogja tenni?

Kicsit kerestem a unix.stackexchange.com oldalon és az interneten, de a dekódoláshoz nem találtam parancssori eszközt url kódolás.

Amit meg akarok csinálni, egyszerűen helyben szerkesszen egy txt fájlt úgy, hogy:

  • %21 lesz !
  • %23 #
  • %24 $
  • lesz &
  • %27 "
  • %28 lesz (
  • %29 )

És így tovább.

Megjegyzések

Válasz

Megtalálta ezeket a Python one vonalakat, amelyek azt csinálnak, amit akar:

Python2

$ alias urldecode="python -c "import sys, urllib as ul; \ print ul.unquote_plus(sys.argv[1])"" $ alias urlencode="python -c "import sys, urllib as ul; \ print ul.quote_plus(sys.argv[1])"" 

Python3

$ alias urldecode="python3 -c "import sys, urllib.parse as ul; \ print(ul.unquote_plus(sys.argv[1]))"" $ alias urlencode="python3 -c "import sys, urllib.parse as ul; \ print (ul.quote_plus(sys.argv[1]))"" 

Példa

$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B 

Referenciák

Megjegyzések

  • Ezt nagyon későn tudom , de van-e valamilyen módja ennek a helyben történő szerkesztéssel?
  • @DisplayName – nekem új Q-nak tűnik. ‘ kérdeztem, és hivatkoztam erre.
  • streaming: cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
  • Lásd: @DIG mbl ‘ válasz beblow egy olyan számára, amely működik a stdin-del.

Válasz

sed

Próbálja ki a következő parancssort:

$ sed "s@+@ @g;s@%@\\x@g" file | xargs -0 printf "%b" 

vagy a következő alternatívát a :

$ sed -e"s/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g" file | xargs echo -e 

Megjegyzés: Előfordulhat, hogy a fenti szintaxis nem konvertál + szóközökhöz, és meg tudja enni az összes új sort.


Megadhatja álnévként, és hozzáadhatja a shell rc fájlokhoz:

$ alias urldecode="sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"" 

Ezután minden alkalommal, amikor szüksége van rá, egyszerűen menjen a következővel:

$ echo "http%3A%2F%2Fwww" | urldecode http://www 

Bash

Szkripteléskor a következő szintaxist használhatja:

input="http%3A%2F%2Fwww" decoded=$(printf "%b" "${input//%/\\x}") 

A fenti szintaxis azonban nem kezeli a pluszokat (+) helyesen, tehát szóközökkel kell helyettesíteni őket a vagy a @isaac javaslatának megfelelően használja a következő szintaxist:

decoded=$(input=${input//+/ }; printf "${input//%/\\x}") 

Használhatja a következő urlencode() és urldecode() funkciókat is:

urlencode() { # urlencode <string> local length="${#1}" for (( i = 0; i < length; i++ )); do local c="${1:i:1}" case $c in [a-zA-Z0-9.~_-]) printf "$c" ;; *) printf "%%%02X" ""$c" ;; esac done } urldecode() { # urldecode <string> local url_encoded="${1//+/ }" printf "%b" "${url_encoded//%/\\x}" } 

Ne feledje, hogy a fenti urldecode() feltételezi, hogy az adatok nem tartalmaznak visszavonást.

Itt található hasonló Joel verzió: https://github.com/sixarm/urldecode.sh


bash + xxd

Bash funkció a xxd eszközzel:

urlencode() { local length="${#1}" for (( i = 0; i < length; i++ )); do local c="${1:i:1}" case $c in [a-zA-Z0-9.~_-]) printf "$c" ;; *) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done esac done } 

Megtalálható a cdown “lényegi fájljában , a stackoverflow fájlban is.


PHP

A PHP használatával kipróbálhatja a következő parancsot:

$ echo oil+and+gas | php -r "echo urldecode(fgets(STDIN));" // Or: php://stdin oil and gas 

vagy csak:

php -r "echo urldecode("oil+and+gas");" 

Használja a -R parancsot többsoros bevitelhez.


Perl

Perlben te használhatja a URI::Escape szót.

decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url") 

Vagy fájl feldolgozásához:

perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file 

awk

Próbálja ki anon megoldás:

awk -niord "{printf RT?$0chr("0x"substr(RT,2)):$0}" RS=%.. 

Megjegyzés: A -n paraméter a GNU awk.

Lásd: Az awk printf használata a szöveg urdekódolásához .

fájlnevek dekódolása

Ha el kell távolítania az URL kódolást a fájlnevekből, használja a deurlname eszközt a renameutils (pl deurlname *.*).

Lásd még:


Kapcsolódó:

megjegyzések

  • awk: chr() könyvtárfüggvény használata, nagy a valószínűsége, hogy kizárólag a GNU awk-n fog működni (gawk). Ebben az esetben azonban alig lesz megfelelője a POSIX awk -nek, mert a -n opció (nem decimális argumentumokat engedélyezve) IS egy GNU awk specialitás.
  • A printf -et érintő megoldásai nem veszik figyelembe ezt az URL tartalmazhat elkerült százalékjeleket, például %25. Ezeket úgy adja át a printf-nek, hogy nem kerüli el a printf-et egy másik százalékjel, például %%.
  • A bash verzióhoz local LC_ALL=C a tetején, különben az összes széles karakter (pl. japán, kínai stb.) nincs megfelelően bájtokra bontva.
  • github.com/SixArm/ urlencode.sh
  • A printf verziók nem ‘ nem működnek, ha a printf BSD verzióját (pl. macOS) használják, azonban a GNU Coreutils verzió.

Válasz

Ehhez van beépített függvény a Python szabványos könyvtárában. A Python 2-ben ez “s urllib.unquote .

decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url") 

Vagy egy fájl feldolgozásához:

python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file 

A Python 3-ban ez “s urllib.parse.unquote .

decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url") 

Vagy fájl feldolgozásához:

python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file 

A Perlben használhatja a URI::Escape .

decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url") 

Vagy egy fájl feldolgozásához:

perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file 

Ha ragaszkodni akar a POSIX hordozható eszközökhöz, akkor ” s kínos, mert az egyetlen komoly jelölt az awk, amely nem értelmezi a hexadecimális számokat. Lásd: Az awk printf használata a szöveg URL-re történő kódolásához példákat a gyakori awk-megvalósításokkal, beleértve a BusyBox-ot is.

Válasz

Perl egy vonalhajózás:

$ perl -pe "s/\%(\w\w)/chr hex $1/ge" 

Példa:

$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !" 

Megjegyzések

  • Ez a válasz vonzó, ha nem ‘ nem akarsz foglalkozni a perl modulok telepítésével.
  • Csak egy elegánsan működött számomra a MacOS-on.
  • Ha egyszerre szeretné megoldani az URL-kódolás összes szintjét, ott ‘ s perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);' is, amely dekódolja az összes %25xx beágyazott kódolást

Válasz

Ha egyszerű gondolkodású sed parancsot szeretne használni, akkor használja a következőket:

sed -e "s/%21/!/g" -e "s/%23/#/g" -e "s/%24/$/g" -e "s/%26/\&/g" -e "s/%27/"/g" -e "s/%28/(/g" -e "s/%29/)/g" 

De kényelmesebb olyan szkriptet létrehozni, mint (mondjuk sedscript):

 s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g  

Ezután futtassa a sed -f sedscript < old > new parancsot, amely a kívánt módon fog kimenni.


A könnyebbség kedvéért a urlencode parancs közvetlenül elérhető a gridsite-clients csomag telepíthető (sudo apt-get install gridsite-clients által Ubuntu / Debian rendszerben).

Név

    urlencode – karakterláncok konvertálása URL-kódolású formába vagy URL-ből

SYNOPSIS

    urlencode [-m|-d] string [string ...]

LEÍRÁS A

    urlencode karakterláncokat kódol az RFC 1738 szerint.

    Vagyis karakterek AZ az 09 . _ és - módosítás nélkül továbbítják, de az összes többi karakter% HH-val van ábrázolva, ahol HH a kettőjük igit nagybetűs hexadecimális ASCII ábrázolás. Például az http://www.gridpp.ac.uk/ URL http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode konvertálódik minden karakter a parancssorban megadott karakterláncokban. Ha több karaktersorozat van megadva, akkor az átalakítás előtt összefűzik őket elválasztó szóközökkel.

OPCIÓK

    -m

      A teljes konvertálás helyett a GridSite “enyhe URL-kódolást” végez amelyben AZ az 0-9. = – _ @ és / és módosítatlanul kerülnek át. Ez valamivel emberileg olvashatóbb karakterláncokat eredményez, de az alkalmazásnak fel kell készülnie arra, hogy létrehozza vagy szimulálja az esetleges perjelekkel jelölt könyvtárakat.

    -d

      URL-dekódolást végezzen inkább mint kódolás, az RFC 1738 szerint a% HH és a% hh karakterláncokat konvertálja, a többi karakter pedig módosítatlanul kerül átadásra, azzal a kivétellel, hogy a + szóközgé alakul.

Példa az URL dekódolására:

$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc 

Megjegyzések

  • A sed látogatás
  • Ez egy rossz megoldás, mert minden karakter kemény kódolását megköveteli. Ezt a problémát példázza, hogy a kódból hiányzik a gyakran használt %20 menekülési szekvencia.
  • @Overv I ‘ ve Felülvizsgált
  • Ezenkívül érdemes még egyszer ellenőrizni a s/%26/&/g tevékenységét. (Kijavítottam.)

Válasz

Nem tudok megjegyzést fűzni a következőhöz: a legjobb válasz ebben a szálban , tehát itt van az enyém.

Személy szerint ezeket az álneveket használom URL kódoláshoz és dekódoláshoz:

alias urlencode="python -c "import urllib, sys; print urllib.quote( sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"" alias urldecode="python -c "import urllib, sys; print urllib.unquote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"" 

Mindkét parancs lehetővé teszi adatok konvertálását, amelyeket parancssori argumentumként adtak át , vagy elolvasták szabványos bemenet , mert mindkét egyvonalas ellenőrzi, hogy vannak-e parancssoros argumentumok (akár üresek is), és feldolgozza, vagy csak olvassa normál bemenet egyébként.


frissítés 2017-05-23 (perjel kódolás)

A @Bevor megjegyzésére válaszul.

Ha kódolni kell a perjelet is, csak adjon hozzá egy üres második argumentumot az idézet függvényhez, ekkor a perjel is kódolásra kerül.

Tehát végül urlencode alias a bash ban így néz ki:

alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")"" 

vizsga ple

$ urlencode "Проба пера/Pen test" %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test $ echo "Проба пера/Pen test" | urlencode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test $ urldecode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test Проба пера/Pen test $ echo "%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test" | urldecode Проба пера/Pen test $ urlencode "Проба пера/Pen test" | urldecode Проба пера/Pen test $ echo "Проба пера/Pen test" | urlencode | urldecode Проба пера/Pen test 

Megjegyzések

  • Nem kódolja a perjeleket.
  • @Bevor : Példa?
  • Perjel hozzáadása az urlencode ” Проба пера ” – > eredmény: A perjel nincs kódolva.
  • @Bevor: Igazad van. Köszönöm a megjegyzést. Válaszomat is megváltoztatom, hogy az tükrözze a megjegyzésedet.

Válasz

GNU Awk

#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } } 

Válasz

És egy másik Perl-megközelítés:

 #!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }  

Telepítenie kell a URI::Encode modult. A Debian-on egyszerűen futtathattam

sudo apt-get install liburi-encode-perl 

Ezután a fenti parancsfájlt futtattam egy tesztfájlon:

 http://foo%21asd%23asd%24%26asd%27asd%28asd%29  

Az eredmény az volt (a szkriptet foo.pl néven mentettem el):

 $ ./foo.pl http://foo!asd#asd$&asd"asd(asd)  

Válasz

Válasz (főleg Posix) héjban:

$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !" 

Magyarázat:

  • -e "s/+/ /g minden + -t átalakít a térben (az ur-kódolási normában leírtak szerint)
  • -e "s/%\(..\)/\\\\x\1/g" mindegyik %XX átalakítása a \\xXX fájlban. Figyelje meg, hogy a \ egyikét szabályokkal idézzük.
  • A belső printf csak azért van, hogy átadja a bemenetet a sednek. Bármely más mechanizmussal helyettesíthetjük
  • A külső printf értelmezi a \\xXX szekvenciákat és megjeleníti az eredményt.

Szerkesztés:

Mivel a % -et mindig az URL-ekben kell értelmezni, egyszerűsíteni lehet ezt a választ. Ezenkívül szerintem tisztább a xargs használata a háttérjegyzetek helyett (a @josch-nak köszönhetően).

$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" % 

Sajnos (ahogy @josch észrevette) ezek a megoldások egyikének sem felelnek meg a Posix-kompatibilitásnak, mivel a \x menekülési sorrend nincs meghatározva a Posix-ban.

Megjegyzések

  • Üdvözöljük az U & L. oldalon! Talán meg tudnád magyarázni ezt a választ és annak működését. Általában azt részesítjük előnyben, hogy a válaszaink hosszúak legyenek, részletekkel, ne csak kódrészletekkel.
  • Nagyon tetszik ez a válasz, mert ‘ átfogó, hordozható és nem ‘ nem igényelnek különlegesen nehezebb külső programokat, mint például a perl vagy a python. Jól működik nekem.
  • Nagyszerű megoldás. És még rövidebb és okosabb: ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. A -e opció itt elhagyható, valójában …
  • @josch Igazad van, a printf egy beépített dash és ‘ nem ismeri fel a \x menekülést. Használhatja a /usr/bin/printf -t a printf helyett a működés érdekében. Általában képesnek kell lennie az command printf használatára, de úgy tűnik, hogy nem úgy működik, ahogy kellene. Továbbra is használja a beépített funkciót.
  • @Jezz valóban a \x menekülés támogatása nem része a POSIX-nak: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html A tesztjeim során egy másik problémát láttam. Érdemes lecserélnie a .. regexet a következőre: [a-zA-Z0-9][a-zA-Z0-9], mert ellenkező esetben a következő bemenet szerepel: A% ‘ nem fog sikerülni. A végén hozzáadtam az s/%/%%/g -t is, hogy biztosan elkerüljem a printf százalékos arányát.

Válasz

Egy másik megoldás rubint használva (az elfogadott python válasz nem működött nálam)

 alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""  

példa

 $ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B  

Megjegyzések

  • Csak a rubinhoz szokott, és ezek az állítások kisebbnek tűnnek. Emellett megváltoztattam az ARGF-et. Olvastam, hogy be tudjam csatolni, mint sok más segédprogrammal!

Válasz

Itt van egy BASH függvény pontosan ehhez:

function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") } 

Megjegyzések

  • varázslatként működik
  • Ha + karaktereket akar átalakítani szóközökkel, és nem szül semmilyen folyamat, használhatja ezt: : "${1//+/ }" && echo -e "${_//%/\\x}"

Válasz

Csak héj:

 $ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ  

-- vagy %b, hogy megakadályozza a gondolatjelekkel kezdődő argumentumok opcióként való kezelését.

A zsh ${x//%/a} hozzáadja a a -t a végéhez, de a ${x//\%/a} a % szöveget .

Válasz

Itt vannak a releváns bitek egy másik szkriptből (amit csak szégyentelenül ellopott egy másik válaszból származó youtube.com letöltési parancsfájlomból ) írtam korábban. A (z) sed és a shell használatával működő urldekódot hoz létre.

set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )" 

Nem esküszöm átfogóan – és valójában kétlem -, de a YouTube-ot eléggé kezelte.

Válasz

A rövid karakterláncok (a shell lassúwww):

$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/; 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük