My understanding of the general form of a URL is that it looks as follows:
://?#
>
Fragment can contain any character at all.
Query can contain any character except for #
, as it is treated as marker (but you can use URL-encoding to still have it there)
So, in general, there are no any reserved characters as long as there is no ambiguity.
See RFC 3987 for the most up-to-date info. Your "general form" is not exactly right