La question demande quels caractères sont autorisés dans les paramètres GET sans les encoder ou les échapper.
Selon RFC3986 (syntaxe générale de l'URL) et RFC7230, section 2.7.1 (syntaxe de l'URL HTTP/S), les seuls caractères que vous devez encoder en pourcentage sont ceux qui se trouvent en dehors de l'ensemble de la query, voir la définition ci-dessous.
Cependant, il existe d'autres spécifications comme HTML5, Web forms, et l'obsolete Indexed search, recommandation du W3C. Ces documents ajoutent un sens spécial à certains caractères notamment, à des symboles comme \= & + ;.
D'autres réponses ici suggèrent que la plupart des caractères réservés devraient être encodés, y compris "/" "?". Ce n'est pas correct. En fait, RFC3986, section 3.4 conseille de ne pas encoder en pourcentage les caractères "/" "?".
il est parfois préférable pour la convivialité d'éviter d'encoder en pourcentage ces caractères.
RFC3986 définit le composant de la requête comme suit:
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
Un mécanisme d'encodage en pourcentage est utilisé pour représenter un octet de données dans un composant lorsque le caractère correspondant à cet octet est en dehors de l'ensemble autorisé ou est utilisé comme délimiteur, ou à l'intérieur du composant.
La conclusion est que la partie XYZ devrait encoder:
special: # % = & ;
Espace
sub-delims
hors de l'ensemble de la query: [ ]
caractères encodables non ASCII
Sauf si les symboles spéciaux = & ; sont des séparateurs clé=valeur.
Encoder d'autres caractères est autorisé mais pas nécessaire.