DevToolBoxFREE
BlogAdvertise

URL Encode & Decode: Vollständiger Leitfaden zur Prozent-Kodierung

10 Min. Lesezeitvon DevToolBox

URL-Kodierung (auch bekannt als Prozent-Kodierung) ist einer der wichtigsten Mechanismen in der Webentwicklung. Jedes Mal, wenn Sie ein Formular absenden, auf einen Link mit Query-Parametern klicken oder eine REST-API aufrufen, finden URL-Kodierungs- und Dekodierungsoperationen statt. Dieser umfassende Leitfaden deckt alles ab, von der RFC-3986-Spezifikation bis zu praktischen Codebeispielen in JavaScript, Python, Bash, PHP und Java.

Testen Sie unser kostenloses Online URL-Kodierungs/Dekodierungs-Tool.

Was ist URL-Kodierung (Prozent-Kodierung)?

URL-Kodierung, definiert in RFC 3986, ersetzt unsichere Zeichen durch ein Prozentzeichen (%) gefolgt von zwei Hexadezimalziffern. Zum Beispiel wird ein Leerzeichen zu %20.

URLs konnen nur eine begrenzte Menge von ASCII-Zeichen enthalten. Die URL-sicheren Zeichen sind: Buchstaben, Ziffern und vier Sonderzeichen: -, _, ., ~. Alle anderen Zeichen mussen kodiert werden.

Zeichen wie &, =, ? und # haben strukturelle Bedeutungen in URLs. Ohne URL-Kodierung wurden URLs brechen oder falsch interpretiert werden.

Wie URL-Kodierung funktioniert

Der URL-Kodierungsprozess folgt einem einfachen Algorithmus:

  1. Zeichen in UTF-8-Bytes konvertieren.
  2. Fur jedes Byte ein % gefolgt vom Hexadezimalwert schreiben.
  3. Nicht reservierte Zeichen bleiben unverandert.
  4. Reservierte Zeichen werden nur bei Mehrdeutigkeit kodiert.

Beispiel: Hello World! wird zu Hello%20World%21.

UTF-8 Mehrbytebeispiel: Nicht-ASCII-Zeichen erzeugen mehrere prozentkodierte Bytes.

URL-Kodierung Referenztabelle

Referenztabelle haufig kodierter Zeichen:

CharacterEncodedDescription
(space)%20Space
!%21Exclamation mark
#%23Hash / Fragment
$%24Dollar sign
%%25Percent sign
&%26Ampersand
'%27Apostrophe
(%28Left parenthesis
)%29Right parenthesis
*%2AAsterisk
+%2BPlus sign
,%2CComma
/%2FForward slash
:%3AColon
;%3BSemicolon
=%3DEquals sign
?%3FQuestion mark
@%40At sign
[%5BLeft bracket
]%5DRight bracket
{%7BLeft brace
}%7DRight brace
|%7CPipe
<%3CLess than
>%3EGreater than
"%22Double quote

Leerzeichenkodierung: %20 vs +

Es gibt zwei gultige Wege, Leerzeichen in URLs zu kodieren:

%20: Standard-RFC-3986-Kodierung fur URIs.

+: Verwendet von application/x-www-form-urlencoded (HTML-Formulare).

Welches verwenden? Verwenden Sie %20 beim programmatischen URL-Aufbau. + wird automatisch fur Formulardaten verwendet.

// Space encoding comparison

// RFC 3986 (URI standard) — space = %20
"hello world"  →  "hello%20world"
// Used in: URL paths, API endpoints, general URIs

// application/x-www-form-urlencoded — space = +
"hello world"  →  "hello+world"
// Used in: HTML form submissions, URLSearchParams

// JavaScript comparison:
encodeURIComponent("hello world")  // "hello%20world"  (%20)
new URLSearchParams({q: "hello world"}).toString()  // "q=hello+world"  (+)

// Python comparison:
urllib.parse.quote("hello world")      # "hello%20world"  (%20)
urllib.parse.urlencode({"q": "hello world"})  # "q=hello+world"  (+)

// PHP comparison:
rawurlencode("hello world")  // "hello%20world"  (%20)
urlencode("hello world")     // "hello+world"    (+)

URL-Kodierung/Dekodierung Codebeispiele

JavaScript URL-Kodierung/Dekodierung

JavaScript bietet encodeURIComponent und encodeURI:

// ===== encodeURIComponent vs encodeURI =====

// encodeURIComponent — encodes EVERYTHING except: A-Z a-z 0-9 - _ . ~
// Use for: individual query parameter values, path segments
encodeURIComponent("hello world & goodbye");
// "hello%20world%20%26%20goodbye"

encodeURIComponent("price=100&category=books");
// "price%3D100%26category%3Dbooks"

// encodeURI — preserves URL structure characters: : / ? # & = @ + $
// Use for: encoding a complete URL
encodeURI("https://example.com/search?q=hello world&lang=en");
// "https://example.com/search?q=hello%20world&lang=en"

// WARNING: Do NOT use encodeURIComponent on full URLs!
encodeURIComponent("https://example.com/path");
// "https%3A%2F%2Fexample.com%2Fpath"  ← BROKEN URL!

// ===== Decoding =====
decodeURIComponent("hello%20world%20%26%20goodbye");
// "hello world & goodbye"

decodeURI("https://example.com/search?q=hello%20world");
// "https://example.com/search?q=hello world"

// ===== URLSearchParams (handles form encoding automatically) =====
const params = new URLSearchParams({
  query: "cats & dogs",
  page: "1",
  filter: "price > 50"
});
params.toString();
// "query=cats+%26+dogs&page=1&filter=price+%3E+50"
// Note: spaces become + (form encoding), & in values becomes %26

// Parse query string
const parsed = new URLSearchParams("?q=hello+world&lang=en");
parsed.get("q");  // "hello world" (+ decoded to space)
parsed.get("lang");  // "en"

// ===== Building URLs with the URL API =====
const url = new URL("https://api.example.com/search");
url.searchParams.set("q", "hello world & more");
url.searchParams.set("limit", "10");
url.toString();
// "https://api.example.com/search?q=hello+world+%26+more&limit=10"

Python URL-Kodierung/Dekodierung

Pythons urllib.parse-Modul bietet umfassende URL-Kodierungsfunktionen:

import urllib.parse

# ===== quote / unquote (RFC 3986 percent-encoding) =====

# Encode a string (spaces become %20)
urllib.parse.quote("hello world & goodbye")
# "hello%20world%20%26%20goodbye"

# By default, / is NOT encoded (safe="/")
urllib.parse.quote("/path/to/file name.txt")
# "/path/to/file%20name.txt"

# Encode everything including /
urllib.parse.quote("/path/to/file", safe="")
# "%2Fpath%2Fto%2Ffile"

# Decode
urllib.parse.unquote("hello%20world%20%26%20goodbye")
# "hello world & goodbye"

# ===== urlencode (for query strings, uses + for spaces) =====
params = {"q": "cats & dogs", "page": 1, "filter": "price > 50"}
urllib.parse.urlencode(params)
# "q=cats+%26+dogs&page=1&filter=price+%3E+50"

# ===== quote_plus (form encoding, spaces become +) =====
urllib.parse.quote_plus("hello world")
# "hello+world"

urllib.parse.unquote_plus("hello+world")
# "hello world"

# ===== With the requests library =====
import requests

# requests handles URL encoding automatically
response = requests.get(
    "https://api.example.com/search",
    params={"q": "hello world", "lang": "en"}
)
# Actual URL: https://api.example.com/search?q=hello+world&lang=en

# For path segments, encode manually
username = "john@example.com"
url = f"https://api.example.com/users/{urllib.parse.quote(username, safe='')}"
# "https://api.example.com/users/john%40example.com"

Bash / curl URL-Kodierung

Mit curl ist das --data-urlencode-Flag der einfachste Ansatz:

# ===== curl --data-urlencode =====

# GET request with URL-encoded query parameter
curl -G "https://api.example.com/search" \
  --data-urlencode "q=hello world & more" \
  --data-urlencode "lang=en"
# Request URL: /search?q=hello%20world%20%26%20more&lang=en

# POST with form-encoded body
curl -X POST "https://api.example.com/submit" \
  --data-urlencode "name=John Doe" \
  --data-urlencode "message=Hello! How are you?"

# ===== Pure Bash URL encoding (using printf) =====
urlencode() {
  local string="${1}"
  local strlen=${#string}
  local encoded=""
  local pos c o
  for (( pos=0 ; pos<strlen ; pos++ )); do
    c=${string:$pos:1}
    case "$c" in
      [-_.~a-zA-Z0-9]) o="${c}" ;;
      *) printf -v o '%%%02X' "'$c" ;;
    esac
    encoded+="${o}"
  done
  echo "${encoded}"
}

urlencode "hello world & goodbye"
# "hello%20world%20%26%20goodbye"

# ===== Using Python one-liner in Bash =====
python3 -c "import urllib.parse; print(urllib.parse.quote('hello world'))"
# "hello%20world"

# ===== Decode URL-encoded strings =====
python3 -c "import urllib.parse; print(urllib.parse.unquote('hello%20world'))"
# "hello world"

PHP URL-Kodierung/Dekodierung

PHP bietet urlencode() und rawurlencode():

<?php
// ===== urlencode / urldecode =====
// Uses + for spaces (application/x-www-form-urlencoded)

echo urlencode("hello world & goodbye");
// "hello+world+%26+goodbye"

echo urldecode("hello+world+%26+goodbye");
// "hello world & goodbye"

// ===== rawurlencode / rawurldecode =====
// Uses %20 for spaces (RFC 3986)

echo rawurlencode("hello world & goodbye");
// "hello%20world%20%26%20goodbye"

echo rawurldecode("hello%20world%20%26%20goodbye");
// "hello world & goodbye"

// ===== When to use which? =====
// urlencode()    → for query string values (form-style)
// rawurlencode() → for URL path segments (RFC 3986)

// Building a URL with encoded path and query
$path = rawurlencode("my file.pdf");
$query = urlencode("search term & more");
$url = "https://example.com/files/{$path}?q={$query}";
// "https://example.com/files/my%20file.pdf?q=search+term+%26+more"

// ===== http_build_query (encode arrays as query strings) =====
$params = [
    "q" => "cats & dogs",
    "page" => 1,
    "tags" => ["php", "url encoding"]
];
echo http_build_query($params);
// "q=cats+%26+dogs&page=1&tags%5B0%5D=php&tags%5B1%5D=url+encoding"
?>

Java URL-Kodierung/Dekodierung

Javas URLEncoder und URLDecoder behandeln URL-Kodierung:

import java.net.URLEncoder;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

// ===== URLEncoder.encode (uses + for spaces) =====

// Always specify UTF-8 charset!
String encoded = URLEncoder.encode(
    "hello world & goodbye", StandardCharsets.UTF_8
);
// "hello+world+%26+goodbye"

// Decode
String decoded = URLDecoder.decode(
    "hello+world+%26+goodbye", StandardCharsets.UTF_8
);
// "hello world & goodbye"

// ===== Convert + to %20 for RFC 3986 compliance =====
String rfc3986 = URLEncoder.encode("hello world", StandardCharsets.UTF_8)
    .replace("+", "%20");
// "hello%20world"

// ===== Java 11+ URI encoding =====
import java.net.URI;

URI uri = URI.create("https://example.com/search");
// For building URLs with encoded parameters:
String query = "q=" + URLEncoder.encode("hello world", StandardCharsets.UTF_8);
URI fullUri = URI.create("https://example.com/search?" + query);
// https://example.com/search?q=hello+world

// ===== Encoding path segments =====
String pathSegment = URLEncoder.encode("my file.pdf", StandardCharsets.UTF_8)
    .replace("+", "%20");
String url = "https://example.com/files/" + pathSegment;
// "https://example.com/files/my%20file.pdf"

Haufige URL-Kodierungsfehler

Die haufigsten Fallstricke:

Doppelte Kodierung: Eine bereits kodierte Zeichenkette erneut kodieren. %20 wird zu %2520.

// Double encoding example — a common bug!

const value = "hello world";

// Correct: encode once
const correct = encodeURIComponent(value);
// "hello%20world" ✓

// Bug: encode twice
const doubleEncoded = encodeURIComponent(encodeURIComponent(value));
// "hello%2520world" ✗  (%25 is the encoded form of %)

// How to detect double encoding:
// If you see %25 in your URLs, you likely have a double encoding issue
// %2520 = double-encoded space (%25 = %, 20 = space)
// %253A = double-encoded colon (%25 = %, 3A = :)

Gesamte URL kodieren: encodeURIComponent() auf eine vollstandige URL anzuwenden zerstort die Struktur.

// Encoding the entire URL — WRONG!
const url = "https://example.com/path?q=hello world";

// WRONG: breaks URL structure
encodeURIComponent(url);
// "https%3A%2F%2Fexample.com%2Fpath%3Fq%3Dhello%20world"

// CORRECT option 1: use encodeURI for full URLs
encodeURI(url);
// "https://example.com/path?q=hello%20world"

// CORRECT option 2: encode only the value
const base = "https://example.com/path";
const query = encodeURIComponent("hello world");
const fullUrl = base + "?q=" + query;
// "https://example.com/path?q=hello%20world"

UTF-8 vergessen: Immer UTF-8 fur URL-Kodierung verwenden.

Pfadsegmente nicht kodieren: Pfade mit Leerzeichen mussen ebenfalls kodiert werden.

Falsche Behandlung von +: + bedeutet Leerzeichen in Formularen, ist aber ein Literal in URLs.

URL-Kodierung in APIs

Korrektes URL-Kodieren ist fur APIs entscheidend:

Query-Parameter: Jeder Parametername und -wert muss einzeln kodiert werden.

Pfad-Parameter: In URL-Pfaden eingebettete Werte mussen ebenfalls kodiert werden.

Formulardaten: application/x-www-form-urlencoded verwendet + fur Leerzeichen.

JSON-Payloads: JSON im Request-Body muss nicht URL-kodiert werden.

// API URL encoding examples

// Query parameters — encode each value individually
const searchTerm = 'price > 100 & category = "electronics"';
const apiUrl = `https://api.example.com/search?q=${encodeURIComponent(searchTerm)}&limit=10`;
// "https://api.example.com/search?q=price%20%3E%20100%20%26%20...&limit=10"

// Path parameters — encode values embedded in paths
const username = "john@example.com";
const profileUrl = `https://api.example.com/users/${encodeURIComponent(username)}/profile`;
// "https://api.example.com/users/john%40example.com/profile"

// Form data (POST) — uses + for spaces
const formBody = new URLSearchParams({
  username: "john doe",
  password: "p@ss w0rd!"
}).toString();
// "username=john+doe&password=p%40ss+w0rd%21"

// JSON as query parameter — encode the entire JSON string
const filters = JSON.stringify({ price: { min: 10, max: 100 } });
const url = `/api/products?filters=${encodeURIComponent(filters)}`;
// "/api/products?filters=%7B%22price%22%3A%7B%22min%22%3A10%2C%22max%22%3A100%7D%7D"

Haufig gestellte Fragen

Was ist URL-Kodierung und warum wird sie benotigt?

URL-Kodierung ersetzt unsichere Zeichen durch Prozent-Hexadezimal-Sequenzen fur sichere Ubertragung in URLs. Sonderzeichen wie &, =, ? und # haben strukturelle Bedeutungen und mussen als Daten kodiert werden.

Was ist der Unterschied zwischen encodeURI und encodeURIComponent?

encodeURI() bewahrt strukturelle URL-Zeichen (:, /, ?, #). encodeURIComponent() kodiert alles ausser nicht reservierte Zeichen. Verwenden Sie encodeURIComponent fur einzelne Parameterwerte.

Sollte man %20 oder + fur Leerzeichen verwenden?

Verwenden Sie %20 fur URLs (RFC 3986). Verwenden Sie + nur fur application/x-www-form-urlencoded. Im Zweifelsfall ist %20 die sicherere Wahl.

URL-Kodierung ist eine grundlegende Fahigkeit der Webentwicklung. Nutzen Sie unser kostenloses Tool fur sofortiges Kodieren und Dekodieren.

URLs sofort kodieren und dekodieren mit unserem kostenlosen Online-Tool.

War das hilfreich?

Stay Updated

Get weekly dev tips and new tool announcements.

No spam. Unsubscribe anytime.

Partner Picks

Sponsor this article

Place your product next to this developer topic with tracked clicks.

Ask about article sponsorship

This site uses cookies for analytics and to display ads. By continuing to browse, you agree. Privacy Policy