{"id":4901,"date":"2021-07-10T02:56:17","date_gmt":"2021-07-10T05:56:17","guid":{"rendered":"https:\/\/bureau-it.com\/artigos\/codifica-decodifica-degli-url-con-sed\/"},"modified":"2024-09-19T22:34:32","modified_gmt":"2024-09-20T01:34:32","slug":"codifica-decodifica-degli-url-con-sed","status":"publish","type":"post","link":"https:\/\/bureau-it.com\/it\/artigos\/codifica-decodifica-degli-url-con-sed\/","title":{"rendered":"Codifica\/decodifica degli URL con sed"},"content":{"rendered":"\n

<\/span>Tempo di lettura stimato: <\/span>4<\/span> minuti<\/span><\/p>\n\n

Introduzione<\/h2>\n\n

La codifica degli URL deve essere applicata ogni volta che \u00e8 necessario utilizzare un carattere riservato in un URL.\nMa quali sono questi caratteri riservati e chi li ha definiti? <\/p>\n\n

I caratteri riservati sono descritti esplicitamente nella RFC 3986: https:\/\/datatracker.ietf.org\/doc\/html\/rfc3986#section-2.2<\/a><\/p>\n\n

Essi sono:<\/p>\n\n

reserved    = gen-delims \/ sub-delims\n\ngen-delims  = \":\" \/ \"\/\" \/ \"?\" \/ \"#\" \/ \"[\" \/ \"]\" \/ \"@\"\n\nsub-delims  = \"!\" \/ \"$\" \/ \"&\" \/ \"'\" \/ \"(\" \/ \")\"\n              \/ \"*\" \/ \"+\" \/ \",\" \/ \";\" \/ \"=\"<\/pre>\n\n

In altre parole: “:” , “,” , “?” , “#” , “[” , “]” , “@”, “!” , “$” , “&” , “‘” , “(” , “)”, “*” , “+” , “,” , “;” , “=”<\/p>\n\n

Per decodificare, devi sapere che vengono utilizzati i codici esadecimali della tabella ASCII.\nConsulta la tabella nel manuale: <\/p>\n\n

man ascii<\/pre>\n\n
\"\"<\/figure>\n\n

Gli URL codificati mostrano il % prima di ogni numero esadecimale nella tabella ASCII.\nPertanto, per creare la codifica, basta sostituire il carattere riservato con %esadecimale<\/strong>! =D <\/p>\n\n

Considera che la tua shell legger\u00e0 e interpreter\u00e0 l’esadecimale con il codice di escape corrispondente.\nPer bash, useremo \\x.\nGuarda la tabella qui sopra e fai i tuoi test.\nPer l’esclamazione ! il codice \u00e8 21.\nDai un’occhiata: <\/p>\n\n

$ echo -e \"\\x21\"\n!<\/pre>\n\n

Sostituzione con sed<\/h2>\n\n

Analizziamo una semplice funzione con sed<\/strong> per effettuare la decodifica:<\/p>\n\n

    #!\/bin\/bash\n    URL_DECODE=\"$(echo \"$1\" | sed -E 's\/%([0-9a-fA-F]{2})\/\\\\x\\1\/g;s\/\\+\/ \/g'\"\n    echo -e \"$URL_DECODE\"<\/pre>\n\n

[0-9a-fA-F]{2}In pratica, il comando sed<\/strong> s\/%( )\/\\x\\1\/g<\/strong> sostituisce tutti i % con \\x, a condizione che i 2 caratteri successivi rappresentino un numero esadecimale (da 00 a FF).\n echo<\/code> Quindi viene attivata l’opzione -e<\/strong> di per interpretare questo esadecimale.\n s\/\\+\/ \/g <\/code>Inoltre, il secondo comando di sed sostituisce i segni + con lo spazio =).\nL’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. <\/p>\n\n

Per uno script un po’ pi\u00f9 sofisticato, che si occupi anche della codifica, utilizziamo una serie di comandi sed in sequenza.<\/p>\n\n

Vedi il codice completo, che include tutti i caratteri riservati dell’RFC 3986:<\/p>\n\n

    #!\/bin\/bash\n    #\n    # Enconding e Decoding de URL com sed\n    #\n    # Por Daniel Cambr\u00eda\n    # daniel.cambria@bureau-it.com\n    #\n    # jul\/2021\n\n    function url_decode() {\n    echo \"$@\" \\\n        | sed -E 's\/%([0-9a-fA-F]{2})\/\\\\x\\1\/g;s\/\\+\/ \/g'\n    }\n\n    function url_encode() {\n        # Conforme RFC 3986\n        echo \"$@\" \\\n        | sed \\\n        -e 's\/ \/%20\/g' \\\n        -e 's\/:\/%3A\/g' \\\n        -e 's\/,\/%2C\/g' \\\n        -e 's\/\\?\/%3F\/g' \\\n        -e 's\/#\/%23\/g' \\\n        -e 's\/\\[\/%5B\/g' \\\n        -e 's\/\\]\/%5D\/g' \\\n        -e 's\/@\/%40\/g' \\\n        -e 's\/!\/%41\/g' \\\n        -e 's\/\\$\/%24\/g' \\\n        -e 's\/&\/%26\/g' \\\n        -e \"s\/'\/%27\/g\" \\\n        -e 's\/(\/%28\/g' \\\n        -e 's\/)\/%29\/g' \\\n        -e 's\/\\*\/%2A\/g' \\\n        -e 's\/\\+\/%2B\/g' \\\n        -e 's\/,\/%2C\/g' \\\n        -e 's\/;\/%3B\/g' \\\n        -e 's\/=\/%3D\/g'\n    }\n\n    echo -e \"URL decode: \" $(url_decode \"$1\")\n    echo -e \"URL encode: \" $(url_encode \"$1\")<\/pre>\n\n

Nota sulla codifica delle stringhe di query<\/h2>\n\n

Spesso il segno + compare negli URL per sostituire lo spazio.\nQuesto accade quando il testo \u00e8 contenuto in una stringa di query.\nVedi questa sezione in RFC1866: https:\/\/datatracker.ietf.org\/doc\/html\/rfc1866#section-8.2.1 <\/p>\n\n

Ma per qualsiasi altra codifica HTML, dovresti utilizzare la codifica percentuale (codifica URL).<\/p>\n\n

Unicode<\/h2>\n\n

Ok, ora che hai capito la logica della cosa, ti starai chiedendo: e se uso i caratteri accentati?<\/p>\n\n

Gli accenti non sono presenti nella tabella ASCII, ma nello standard Unicode.\nQuesto standard pu\u00f2 essere visualizzato come UTF-8, UTF-16 e UTF-32 (UTF= Unicode Transformation Format, per saperne di pi\u00f9 visita https:\/\/www.unicode.org\/faq\/utf_bom.html)<\/a>.\nPuoi trovare maggiori informazioni su Unicode direttamente dalla fonte: https: \/\/unicode.org\/.<\/a> <\/p>\n\n

Se l’impostazione predefinita per l’utilizzo di un numero esadecimale \u00e8 \\x, l’unicode \u00e8 \\u.\nAd esempio: <\/p>\n\n

echo -e \"\\u2623\"\nprintf \"\\u2623\"\npython -c 'print u\"\\u2623\"'<\/pre>\n\n

Per verificare di quale codice esadecimale si tratta, usa hexdump:<\/p>\n\n

$ echo -en \"\u2623\" | hexdump\n0000000 e2 98 a3\n\n$ echo -e \"\\xe2\\x98\\xa3\"\n\u2623<\/pre>\n\n

Per verificare il codice unicode a partire da un codice<\/a> esadecimale, dovrebbe essere sufficiente quest’area del sito web Unicode che cerca le tabelle dei codici dei<\/a> caratteri, ma accetta solo l’esadecimale UTF-16.\nTuttavia, \u00e8 possibile verificare quale codice Unicode \u00e8 UTF-8 esadecimale attraverso la ricerca che il sito scarfboy effettua.\nDai un’occhiata: <\/p>\n\n