Why URLs need an escape mechanism at all
A URL is not free-form text. Certain characters are structural: `?` starts the query string, `&` separates parameters, `=` splits a name from a value, `/` divides path segments, and `#` begins the fragment. If a value you want to transmit contains any of those, it will be read as structure rather than data, and the URL will be parsed into the wrong pieces.
Percent-encoding solves this by replacing a character with `%` followed by its two-digit hexadecimal byte value. A space becomes `%20`, an ampersand becomes `%26`, a question mark becomes `%3F`. The URL parser sees only unreserved characters and percent triplets, so the structure stays unambiguous while the original value survives intact.
The distinction that matters is between reserved characters used structurally and the same characters appearing inside a value. A `&` between parameters must stay literal; a `&` inside a company name must be encoded. Which is which depends on intent, not on the character - which is why encoding has to be applied to each component separately rather than to a whole URL at once.