The profiles share UTF-8 percent escapes but do not spell every value the same way. RFC 3986 component output keeps letters, digits, hyphen, period, underscore and tilde. HTML form component output keeps letters, digits, asterisk, hyphen, period and underscore and gives space a special plus spelling.
%20 and + are profile choices
An RFC component encodes a space byte as %20 and treats a literal plus as data that must become %2B. Form encoding writes a space as + and also writes a literal plus as %2B. Therefore a decoder must know the profile before it can decide whether a raw plus means plus or space; URLCodec never guesses.
A component is not a complete URL
Delimiters such as slash, question mark, ampersand, equals and hash structure a complete URL, but inside one scalar component they are data and receive escapes. URLCodec intentionally has no full-URL mode. This forces the caller to identify the boundary first and prevents an attractive but ambiguous output that mixes syntax with values.
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.