RFC 3986 Reserved vs Unreserved Characters: The Definitive URI Cheatsheet
Master the IETF RFC 3986 URI specification. Learn the difference between unreserved characters, gen-delims, sub-delims, and percent-encoding rules.
IETF RFC 3986 categorizes all characters in a URI into Unreserved characters (A-Z, a-z, 0-9, '-', '_', '.', '~', which never require encoding), Reserved Gen-Delims (:, /, ?, #, [, ], @), and Reserved Sub-Delims (!, $, &, ', (, ), *, +, ,, ;, =). Any character outside the unreserved set must be percent-encoded when used for non-structural data.
Solve this problem now with our free URL Encoder / Decoder
Try it instantly in your browser โ zero tracking, 100% client-side privacy.
Specification & Architecture Reference
| RFC 3986 Category | Character Set | Encoding Requirement in Data Payloads |
|---|---|---|
| Unreserved Characters | A-Z a-z 0-9 - _ . ~ | Never encoded (Must NOT be percent-encoded) |
| General Delimiters (gen-delims) | : / ? # [ ] @ | Must be percent-encoded when appearing inside parameter values |
| Sub-delimiters (sub-delims) | ! $ & ' ( ) * + , ; = | Must be percent-encoded if used as literal parameter content |
| Non-ASCII / UTF-8 | Accented letters, Emojis, Symbols | Encoded into UTF-8 octets, then percent-encoded (%F0%9F...) |
The Architecture of RFC 3986
The **IETF RFC 3986 Uniform Resource Identifier (URI)** specification governs how every link, route, and query string across the web must be constructed.
The specification divides characters into two functional categories:
1. Unreserved Characters (Never Encoded) These characters have no syntactic or structural role in a URI. RFC 3986 explicitly dictates that unreserved characters **must not** be percent-encoded: ```text ALPHA / DIGIT / "-" / "." / "_" / "~" ``` For example, encoding the tilde `~` as `%7E` is technically redundant according to RFC 3986 ยง2.3.
2. Reserved Characters (Delimiters) Reserved characters serve as structural separators in the URI syntax: - **General Delimiters (gen-delims):** `: / ? # [ ] @` define the major structural boundaries (scheme, host, path, query, fragment). - **Sub-delimiters (sub-delims):** `! $ & ' ( ) * + , ; =` define intra-component boundaries, such as separating keys from values (`key=value`) and chaining items (`&item=2`).
When you want to include a reserved character as literal data content inside a path or query parameter, it **must** be percent-encoded so the parser does not treat it as a structural delimiter.
The Canonical Percent-Encoding Table - `:` $\rightarrow$ `%3A` - `/` $\rightarrow$ `%2F` - `?` $\rightarrow$ `%3F` - `#` $\rightarrow$ `%23` - `&` $\rightarrow$ `%26` - `=` $\rightarrow$ `%3D` - `+` $\rightarrow$ `%2B`
Verify and format RFC 3986 URLs directly in your browser with Mickytool's **URL Encoder / Decoder**.
Solve this problem now with our free URL Encoder / Decoder
Execute this workflow immediately without saving data on remote servers.
Frequently Asked Questions
Why is the tilde (~) often encoded as %7E by older libraries?
The earlier RFC 2396 specification classified the tilde as a reserved character. RFC 3986 updated the tilde to the unreserved category in 2005.
Can emojis be placed directly in a URL?
Raw Unicode characters cannot appear in valid URIs. Emojis must be converted to their UTF-8 byte sequences and percent-encoded (e.g. ๐ becomes %F0%9F%9A%80).