Skip to content

All tools (41)

JSON 6
Time & Date 4
Encoding & Decoding 4
Generators 3
Text & Data 4
Logs & Debugging 1
Config & Infra 3
Security & Hashing 4
Color & Design 5
Numbers & Bits 3
Web & Markup 4

Nothing leaves the cave.

Nothing you paste ever leaves your device. There is no server to send it to.

How you can check →
DevToolsCave

    This tool runs entirely in your browser. Nothing you paste is uploaded.

    How you can check →

    URL Encoding Table — Percent Encoding Chart

    Every printable character, and how each of the four URL encoding modes handles it — the column no other encoding table on the web has.

    Legend: unreserved reserved sub-delim
    Char Code point encodeURIComponent encodeURI Form (+) Strict RFC 3986 Copy
    (space) U+0020 %20 %20 + %20
    ! U+0021 ! ! %21 %21
    " U+0022 %22 %22 %22 %22
    # U+0023 %23 # %23 %23
    $ U+0024 %24 $ %24 %24
    % U+0025 %25 %25 %25 %25
    & U+0026 %26 & %26 %26
    ' U+0027 ' ' %27 %27
    ( U+0028 ( ( %28 %28
    ) U+0029 ) ) %29 %29
    * U+002A * * * %2A
    + U+002B %2B + %2B %2B
    , U+002C %2C , %2C %2C
    - U+002D - - - -
    . U+002E . . . .
    / U+002F %2F / %2F %2F
    0 U+0030 0 0 0 0
    1 U+0031 1 1 1 1
    2 U+0032 2 2 2 2
    3 U+0033 3 3 3 3
    4 U+0034 4 4 4 4
    5 U+0035 5 5 5 5
    6 U+0036 6 6 6 6
    7 U+0037 7 7 7 7
    8 U+0038 8 8 8 8
    9 U+0039 9 9 9 9
    : U+003A %3A : %3A %3A
    ; U+003B %3B ; %3B %3B
    < U+003C %3C %3C %3C %3C
    = U+003D %3D = %3D %3D
    > U+003E %3E %3E %3E %3E
    ? U+003F %3F ? %3F %3F
    @ U+0040 %40 @ %40 %40
    A U+0041 A A A A
    B U+0042 B B B B
    C U+0043 C C C C
    D U+0044 D D D D
    E U+0045 E E E E
    F U+0046 F F F F
    G U+0047 G G G G
    H U+0048 H H H H
    I U+0049 I I I I
    J U+004A J J J J
    K U+004B K K K K
    L U+004C L L L L
    M U+004D M M M M
    N U+004E N N N N
    O U+004F O O O O
    P U+0050 P P P P
    Q U+0051 Q Q Q Q
    R U+0052 R R R R
    S U+0053 S S S S
    T U+0054 T T T T
    U U+0055 U U U U
    V U+0056 V V V V
    W U+0057 W W W W
    X U+0058 X X X X
    Y U+0059 Y Y Y Y
    Z U+005A Z Z Z Z
    [ U+005B %5B %5B %5B %5B
    \ U+005C %5C %5C %5C %5C
    ] U+005D %5D %5D %5D %5D
    ^ U+005E %5E %5E %5E %5E
    _ U+005F _ _ _ _
    ` U+0060 %60 %60 %60 %60
    a U+0061 a a a a
    b U+0062 b b b b
    c U+0063 c c c c
    d U+0064 d d d d
    e U+0065 e e e e
    f U+0066 f f f f
    g U+0067 g g g g
    h U+0068 h h h h
    i U+0069 i i i i
    j U+006A j j j j
    k U+006B k k k k
    l U+006C l l l l
    m U+006D m m m m
    n U+006E n n n n
    o U+006F o o o o
    p U+0070 p p p p
    q U+0071 q q q q
    r U+0072 r r r r
    s U+0073 s s s s
    t U+0074 t t t t
    u U+0075 u u u u
    v U+0076 v v v v
    w U+0077 w w w w
    x U+0078 x x x x
    y U+0079 y y y y
    z U+007A z z z z
    { U+007B %7B %7B %7B %7B
    | U+007C %7C %7C %7C %7C
    } U+007D %7D %7D %7D %7D
    ~ U+007E ~ ~ %7E ~
    é U+00E9 %C3%A9 %C3%A9 %C3%A9 %C3%A9
    ñ U+00F1 %C3%B1 %C3%B1 %C3%B1 %C3%B1
    ü U+00FC %C3%BC %C3%BC %C3%BC %C3%BC
    ß U+00DF %C3%9F %C3%9F %C3%9F %C3%9F
    U+20AC %E2%82%AC %E2%82%AC %E2%82%AC %E2%82%AC
    £ U+00A3 %C2%A3 %C2%A3 %C2%A3 %C2%A3
    © U+00A9 %C2%A9 %C2%A9 %C2%A9 %C2%A9
    😀 U+1F600 %F0%9F%98%80 %F0%9F%98%80 %F0%9F%98%80 %F0%9F%98%80

    Reserved, unreserved, and sub-delimiters

    RFC 3986 splits URI characters into a few groups. Unreserved characters — letters, digits, and - _ . ~ — never need escaping anywhere in a URI, so every encoding mode leaves them alone. Reserved characters like : / ? # [ ] @ are structural: a / in a path is a segment separator, so a literal / that is meant as data, not structure, has to be escaped to %2F or it will be read as a boundary. Sub-delimiters like ! $ & ' ( ) * + , ; = carry meaning inside a specific component, most often a query string, where & separates parameters and = separates a key from its value.

    Why the four columns differ

    encodeURIComponent is built for encoding a single value that will sit inside a larger URI — a query parameter, for example — so it escapes every reserved and sub-delimiter character except ! ' ( ) *. encodeURI is built for encoding a whole URI that may already contain structural characters, so it leaves the reserved set untouched and only escapes characters that are never valid anywhere in a URI. Form encoding follows application/x-www-form-urlencoded, the rules a browser uses to submit an HTML form, which is why it turns a space into + rather than %20. Strict RFC 3986 is the specification's own minimal safe set, with no exceptions for the five sub-delimiters encodeURIComponent leaves alone — which is exactly why signature schemes like OAuth 1.0 and AWS SigV4 reject a naive encodeURIComponent call. The URL Encoder / Decoder names all four modes for the situation they fit, not just the function that implements them.

    How this table is generated

    Every value here comes from calling the exact same encoding function the URL Encoder / Decoder uses, so this table cannot drift out of sync with the tool. It covers every printable ASCII character plus a small, curated set of common non-ASCII characters — not a full sweep of Unicode, since a page per character is exactly the doorway-page shape this site avoids. Pasting a whole string instead of a single character? Use the encoder directly, or the URL Parser to split a full URL into its parts.

    Frequently asked questions

    Why do the four columns differ for the same character?
    "URL encode" isn't one operation — encodeURI, encodeURIComponent, form encoding (URLSearchParams) and strict RFC 3986 each leave a different set of characters unescaped. A character like * is left alone by encodeURIComponent and form encoding but escaped by strict RFC 3986, so which column is "correct" depends on where the encoded value is going.
    What's the difference between reserved and unreserved characters?
    Unreserved characters (letters, digits, - _ . ~) never need escaping anywhere in a URI. Reserved characters (: / ? # [ ] @) and sub-delimiters (! $ & ' ( ) * + , ; =) have special meaning in specific parts of a URL — a / in a path is a separator, but a literal / inside a path segment needs escaping to avoid being read as one.
    Why is space encoded as + in one column but %20 in the others?
    The form column follows application/x-www-form-urlencoded, the encoding query strings and form bodies use, where + means space. Everywhere else in a URI, %20 is the only correct encoding for a space, and a literal + means a literal plus sign.
    Does this table match what the URL Encoder tool produces?
    Yes — every value in this table is generated by calling the same encoding function the URL Encoder / Decoder tool uses, so the two can never disagree.