Entendendo a codificação de URL e o percent-encoding
O que esta ferramenta faz
Uma URL só consegue transportar com segurança um conjunto limitado de caracteres. Tudo que fica fora das letras, dígitos e alguns símbolos não reservados precisa ser reescrito como percent-encoding: um sinal % seguido do valor do byte em hexadecimal. Esta ferramenta converte texto comum nessa forma codificada e também faz o caminho inverso, devolvendo sequências como %20 e %26 aos caracteres que representam.
Dois tipos de codificação cobrem as situações que você realmente encontra. A codificação padrão usa o encodeURIComponent do JavaScript: todo caractere é escapado, exceto letras, dígitos e - _ . ! ~ * ' ( ), inclusive caracteres estruturais como :, /, ?, # e &, que é o que você precisa para uma parte isolada, como o valor de um parâmetro. A codificação de formulário segue a regra application/x-www-form-urlencoded usada pelo navegador ao enviar um formulário e escreve um espaço como + em vez de %20.
Quando usar
Use a codificação padrão sempre que um valor entrar em uma query string: um termo de busca, um endereço de e-mail ou um destino de redirecionamento que contenha ?, & ou =. Codificá-lo evita que esses símbolos sejam lidos como estrutura da URL e quebrem o link. Como todos os caracteres estruturais são escapados, codifique as partes de um endereço uma a uma: codificar uma URL pronta também escaparia suas barras e o ponto de interrogação, o que só está certo quando essa URL é ela mesma um valor dentro de outra. A codificação de formulário corresponde ao corpo de uma requisição POST ou a uma carga de formulário montada à mão, onde os espaços viram + em vez de %20. Decodificar é igualmente comum: colar um link codificado vindo de um log, de um relatório de analytics ou de uma cadeia de redirecionamentos e ler para onde ele realmente aponta.
Um exemplo concreto
Pegue o texto hello world & café. Na codificação padrão, um espaço vira %20, o e comercial vira %26 e café — como o é é armazenado em dois bytes UTF-8 — vira caf%C3%A9. Na codificação de formulário, esse mesmo espaço é escrito como +, resultando em hello+world. Uma linha de resumo conta quantos caracteres mudaram e que parte do texto isso representa.
Observações e casos extremos
Os caracteres reservados (: / ? # [ ] @ ! $ & ' ( ) * + , ; =) têm significado dentro de uma URL. Os dois tipos escapam : / ? # [ ] @ $ & + , ; = e deixam ! ' ( ) * como estão, então codifique um valor antes de colocá-lo em uma query string, não a URL pronta. A codificação é definida sobre bytes UTF-8, então qualquer caractere não ASCII se expande em vários grupos %XX. Evite codificar uma URL duas vezes: um % solto que já faz parte de um escape vira %25 e o link deixa de funcionar. Na dúvida, decodifique primeiro para verificar se o texto está cru ou já escapado.