Tempo di lettura stimato: 4 minuti
Introduzione
La codifica degli URL deve essere applicata ogni volta che è necessario utilizzare un carattere riservato in un URL. Ma quali sono questi caratteri riservati e chi li ha definiti?
I caratteri riservati sono descritti esplicitamente nella RFC 3986: https://datatracker.ietf.org/doc/html/rfc3986#section-2.2
Essi sono:
reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
In altre parole: “:” , “,” , “?” , “#” , “[” , “]” , “@”, “!” , “$” , “&” , “‘” , “(” , “)”, “*” , “+” , “,” , “;” , “=”
Per decodificare, devi sapere che vengono utilizzati i codici esadecimali della tabella ASCII. Consulta la tabella nel manuale:
man ascii
Gli URL codificati mostrano il % prima di ogni numero esadecimale nella tabella ASCII. Pertanto, per creare la codifica, basta sostituire il carattere riservato con %esadecimale! =D
Considera che la tua shell leggerà e interpreterà l’esadecimale con il codice di escape corrispondente. Per bash, useremo \x. Guarda la tabella qui sopra e fai i tuoi test. Per l’esclamazione ! il codice è 21. Dai un’occhiata:
$ echo -e "\x21" !
Sostituzione con sed
Analizziamo una semplice funzione con sed per effettuare la decodifica:
#!/bin/bash URL_DECODE="$(echo "$1" | sed -E 's/%([0-9a-fA-F]{2})/\\x\1/g;s/\+/ /g'" echo -e "$URL_DECODE"
[0-9a-fA-F]{2}In pratica, il comando sed s/%( )/\x\1/g sostituisce tutti i % con \x, a condizione che i 2 caratteri successivi rappresentino un numero esadecimale (da 00 a FF).
echo
Quindi viene attivata l’opzione -e di per interpretare questo esadecimale.
s/\+/ /g
Inoltre, il secondo comando di sed sostituisce i segni + con lo spazio =).
L’opzione -E in sed serve a consentire l’uso delle moderne espressioni regolari, per evitare l’uso di molti caratteri di escape che incasinano la sintassi.
Per uno script un po’ più sofisticato, che si occupi anche della codifica, utilizziamo una serie di comandi sed in sequenza.
Vedi il codice completo, che include tutti i caratteri riservati dell’RFC 3986:
#!/bin/bash # # Enconding e Decoding de URL com sed # # Por Daniel Cambría # [email protected] # # jul/2021 function url_decode() { echo "$@" \ | sed -E 's/%([0-9a-fA-F]{2})/\\x\1/g;s/\+/ /g' } function url_encode() { # Conforme RFC 3986 echo "$@" \ | sed \ -e 's/ /%20/g' \ -e 's/:/%3A/g' \ -e 's/,/%2C/g' \ -e 's/\?/%3F/g' \ -e 's/#/%23/g' \ -e 's/\[/%5B/g' \ -e 's/\]/%5D/g' \ -e 's/@/%40/g' \ -e 's/!/%41/g' \ -e 's/\$/%24/g' \ -e 's/&/%26/g' \ -e "s/'/%27/g" \ -e 's/(/%28/g' \ -e 's/)/%29/g' \ -e 's/\*/%2A/g' \ -e 's/\+/%2B/g' \ -e 's/,/%2C/g' \ -e 's/;/%3B/g' \ -e 's/=/%3D/g' } echo -e "URL decode: " $(url_decode "$1") echo -e "URL encode: " $(url_encode "$1")
Nota sulla codifica delle stringhe di query
Spesso il segno + compare negli URL per sostituire lo spazio. Questo accade quando il testo è contenuto in una stringa di query. Vedi questa sezione in RFC1866: https://datatracker.ietf.org/doc/html/rfc1866#section-8.2.1
Ma per qualsiasi altra codifica HTML, dovresti utilizzare la codifica percentuale (codifica URL).
Unicode
Ok, ora che hai capito la logica della cosa, ti starai chiedendo: e se uso i caratteri accentati?
Gli accenti non sono presenti nella tabella ASCII, ma nello standard Unicode. Questo standard può essere visualizzato come UTF-8, UTF-16 e UTF-32 (UTF= Unicode Transformation Format, per saperne di più visita https://www.unicode.org/faq/utf_bom.html). Puoi trovare maggiori informazioni su Unicode direttamente dalla fonte: https: //unicode.org/.
Se l’impostazione predefinita per l’utilizzo di un numero esadecimale è \x, l’unicode è \u. Ad esempio:
echo -e "\u2623" printf "\u2623" python -c 'print u"\u2623"'
Per verificare di quale codice esadecimale si tratta, usa hexdump:
$ echo -en "☣" | hexdump 0000000 e2 98 a3 $ echo -e "\xe2\x98\xa3" ☣
Per verificare il codice unicode a partire da un codice esadecimale, dovrebbe essere sufficiente quest’area del sito web Unicode che cerca le tabelle dei codici dei caratteri, ma accetta solo l’esadecimale UTF-16. Tuttavia, è possibile verificare quale codice Unicode è UTF-8 esadecimale attraverso la ricerca che il sito scarfboy effettua. Dai un’occhiata:
Unicode in macOS bash
echo -e "\u2623"
Su MacOS, a causa di problemi di licenza software con bash a partire dalla versione 4.0, non possiamo generare unicode come ☣ con .
brew install bash
Ma puoi installare l’aggiornatissima bash 5+ usando .
Se non hai mai usato brew, l’installazione è molto semplice: dai un’occhiata al sito web dell’autore https://brew.sh.In quest’altro articolo, la procedura per rendere la nuova bash predefinita è molto dettagliata.
Fortunatamente, gli utenti di Linux non avranno questo problema.
=D
Se vuoi generare un elenco ENORME di caratteri unicode, prova questo script qui sotto.
chmod +x
Ricordati di salvarlo in un file e di dargli il permesso di esecuzione con .
Se non compare nessun carattere, rileggi il paragrafo precedente e aggiorna la tua bash XD
#!/bin/bash for y in $(seq 0 524287) do for x in $(seq 0 7) do a=$(expr $y \* 8 + $x) echo -ne "$a \\u$a " done echo done
Vedi anche
- Guarda la “Tabella” ufficiale di Unicode https://www.unicode.org/charts/
- Consulente con buone informazioni sui caratteri Unicode https://www.fileformat.info/info/unicode/char/2623/index.htm
- Un altro interessante consulente unicode https://unicode.scarfboy.com
- Come convertire UTF https://www.unicode.org/faq/utf_bom.html#gen4
- Maggiori informazioni sulla conversione UTF-8 https://www.fileformat.info/info/unicode/utf8.htm
Domande?
Scrivete nei commenti. Alla prossima!