Percent-encoding operates on bytes. ASCII text often maps one character to one byte, but accented letters, Cyrillic and emoji use multiple UTF-8 bytes. Each byte that is not left literal by the selected profile becomes a percent sign followed by two hexadecimal digits.

The é scalar becomes two escapes

In UTF-8, é is the byte sequence C3 A9, so the RFC component output is %C3%A9. The letter is one Unicode scalar and one visible character, but two bytes and six ASCII output characters. URLCodec shows all four views so a longer encoded string is explainable rather than surprising.

Hex case decodes equally but canonical output is uppercase

Both %c3%a9 and %C3%A9 describe the same bytes. URLCodec accepts either during decoding, then re-encodes the decoded text and compares the source with its uppercase canonical form. This preserves interoperability while making copied output deterministic and easy to compare in tests and documentation.

Check the receiving component

Percent-encoding is contextual. URLCodec deliberately transforms one scalar value and does not parse a complete URL, split query pairs, normalize a path, validate a destination, or decide whether another system expects form rules. Copy the result only into the component whose contract you checked. Encoding changes representation; it does not encrypt, authenticate, sanitize, or make a destination safe.