Devi inserire UTF-8 in "markup" html, il browser "dovrebbe" scrivere e inviare i dati in UTF-8 codificati ma essenzialmente quando recuperi i valori REQUEST, GET, POST, COOKIE (aggiungi $_ ecco i nomi dei superglobali php) vengono auto decodificati quindi se usi urlencode ogni sequenza % che non sia seguita da due cifre esadecimali non è un valore valido (un pre check per garantire che sia valido sin dall'origine e eventualmente convertire la codifica x in UTF-8) significa se uno script scritto erroneamente ignora la codifica url e invia %ciao la funzione urlencode la fa diventare %25ciao.
È probabile che il tuo php sia impostato con content type ISO-8859-1.. si raccomanda di utilizzare almeno php 7.3.
Come vedi l'argomento è abbastanza difficile poiché la natura di html ergo derivato di SGML usa standard solo nella propria rfc.
<meta charset="utf-8">
PHP
header('Content-type: text/html; charset=utf-8');
https://www.php.net/manual/en/ini.core.php#ini.default-charset
Funzione per codificare una stringa ISO-8859-1 (ovviamente valida) verso UTF-8
https://www.php.net/manual/en/function.utf8-encode.ph
Controlla L'origine di POST grezzo "non si può
utilizzare con enctype="multipart/form-data per inteso quando non invia coppie di nome=valore seguiti da una e commerciale se è presente più di una"
https://www.php.net/manual/en/wrappers.php.ph
%26%23321%3b significa Ł entità HTML decimale L.
Il web server, proxy e il database può usare regole diverse per l'enconding, lo scrivo per promemoria e sarà tua cura approfondire.