nello specifico sono tutti i caratteri di una url http.
Nei form html con method GET o POST (che inviano dati con percent enconding) e enctype application/www-form-urlencoded.
es. dei valori di un input in una form,con codifica charset=windows-1252 <input type="text" name="servizio" value="ciao["> diventa servizio=ciao%5B.
come vedi non è un caratteri speciale html, ma riservato in http.
il carattere - o _ nel name dei services, va bene (- come query, ma non come directory).
ps. se vuoi ti faccio uno script php, dove verifichi i caratteri.. (però ti consiglio di leggere le specifiche http).
ps2. in sintesi devi creare, qualcosa che suddivida un link in più parti (parte fissa più coppie/valore), dopo il primo carattere ? suddividi coppia/valore (per riferimento il simbolo & o &), suddividi l' = fai l'encode di coppia e value aggiungi l'= alla coppia e il carattere & non encodato al value(iniziando dal primo value vuoto o non vuoto).