Чтобы конструировать самостоятельно get-параметры в ссылке вам нужно полностью соблюдать стандарт кодирования символов RFC 3986.
На стороне сервера это делается так:
https://www.php.net/manual/ru/function.rawurlencode.php
https://www.php.net/manual/ru/function.rawurldecode.php
На стороне клиента так:
https://developer.mozilla.org/ru/docs/Web/JavaScri...
Чтобы строго соблюдать RFC 3986 (который резервирует !, ', (, ), и *), даже не смотря на то, что символы не используют сформированных URI разделителей, можно безопасно использовать следующее:
function fixedEncodeURIComponent (str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}