What does each of this characters mean in context of an URI?
Note that a URI consists of several different "contexts" or parts. eg. the scheme, host, URL-path, query string and fragment identifier. Whether a reserved character has special meaning is dependent on where in the URL that character is used. These "reserved characters" are often used to delimit parts of the URI. You only need to encode these characters if they conflict with the "special meaning" (if any).
Some characters are simply defined as possible alternatives to others, so might not carry any special meaning (on the server) where it is processed.
I'll start the ball rolling, some I'm not sure about:
#! (hash-bang) - but this was Google, not a "standard".
# (Hash / Pound) - Delimits the fragment identifier. (Last part of the URL, client-side only, not passed to the server.)
encodeURIComponent() will encode this character (whereas
encodeURI() does not) which implies it might have special meaning in the query string.
& (Ampersand) - Used to delimit query string parameters.
+ (Plus) - Can be used to encode a space (alternative to
%20) in the query string only. A literal
+ when used in the URL-path.
, (Comma) - An alternative to
/ (Slash) - Delimits path segments in the URL-path.
: (Colon) - Delimits the scheme from the host and host from the port.
; (Semicolon) - Delimits URL parameters in the query string.
= (Equals) - Delimits name/value pairs in the query string.
? (Question Mark) - Delimits the start of the query string.
@ (At) - Delimits userinfo in the authority part of the URL.
] (Square Brackets) - Note sure. These are used by PHP to allow array-like parameter names in the query string - although I don't think this is the "official" use.
Just to note the differences between PHP (
RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax