Codifique ou decodifique um endereço, um valor de consulta ou o corpo de um formulário. UTF-8 corresponde a encodeURIComponent. Troque a codificação se o outro lado não for Unicode.
Três codificações, três lugares no endereço
Uma barra no caminho tem de continuar barra. Dentro de um parâmetro tem de virar %2F. No formulário o espaço é +; na query, quase sempre %20. Codificar o endereço inteiro com a função errada abre outra página.
Um valor é encodeURIComponent. Busca, id, retorno.
O endereço inteiro é encodeURI. Ficam : / ? #.
Corpo do formulário: o espaço vira mais. É um POST, não um link.
O que costuma sair errado
Um mais de verdade dentro do valor tem de ser %2B, senão o servidor lê um espaço. & e = dentro do valor abrem o parâmetro seguinte. UTF-8 é o padrão e corresponde a encodeURIComponent: cada byte de um acento vira % mais dois hexadecimais. «ação» não é um único escape. Se o outro lado não for Unicode, troque a codificação. Hex codifica os bytes crus do campo.
Não codifique um https:// já montado como se fosse um só valor: somem os dois-pontos e as barras. Codifique as partes e depois junte. Bytes: texto para bytes. Outra forma: Base64.
Perguntas
O espaço virou um mais
Você está no corpo do formulário. Para um link, use um valor só.
Depois de decodificar ainda tem %20
Foi codificado duas vezes. Decodifique de novo, até dar para ler.