encodeURIComponent()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die Funktion encodeURIComponent() kodiert eine URI, indem sie jede Instanz bestimmter Zeichen durch ein, zwei, drei oder vier Escape-Sequenzen ersetzt, die die UTF-8-Kodierung des Zeichens darstellen (es wird nur vier Escape-Sequenzen für Zeichen geben, die aus zwei Surrogat-Zeichen bestehen). Im Vergleich zu encodeURI() kodiert diese Funktion mehr Zeichen, einschließlich solcher, die Teil der URI-Syntax sind.

Probieren Sie es aus

// Encodes characters such as ?,=,/,&,:
console.log(`?x=${encodeURIComponent("test?")}`);
// Expected output: "?x=test%3F"

console.log(`?x=${encodeURIComponent("шеллы")}`);
// Expected output: "?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"

Syntax

js
encodeURIComponent(uriComponent)

Parameter

uriComponent

Ein String, der als URI-Komponente (ein Pfad, Abfragezeichenfolge, Fragment usw.) kodiert werden soll. Andere Werte werden in Strings konvertiert.

Rückgabewert

Ein neuer String, der die bereitgestellte uriComponent als URI-Komponente kodiert darstellt.

Ausnahmen

URIError

Wird ausgelöst, wenn uriComponent ein alleinstehendes Surrogat enthält.

Beschreibung

encodeURIComponent() ist eine Funktions-Eigenschaft des globalen Objekts.

encodeURIComponent() verwendet denselben Kodierungsalgorithmus wie in encodeURI() beschrieben. Es ersetzt alle Zeichen außer:

A–Z a–z 0–9 - _ . ! ~ * ' ( )

Im Vergleich zu encodeURI() ersetzt encodeURIComponent() eine größere Menge von Zeichen. Verwenden Sie encodeURIComponent() für benutzereingetragene Felder in Formularen, die an den Server gesendet werden — dies kodiert &-Symbole, die während der Dateneingabe versehentlich für Zeichenreferenzen oder andere Zeichen generiert werden können, die eine Kodierung/Dekodierung erfordern. Zum Beispiel könnte, wenn ein Benutzer Jack & Jill eingibt, ohne encodeURIComponent() das Ampersand auf dem Server als Beginn eines neuen Feldes interpretiert werden und die Integrität der Daten gefährden.

Für application/x-www-form-urlencoded sollen Leerzeichen durch + ersetzt werden, daher könnte es sinnvoll sein, nach einem encodeURIComponent() ein zusätzliches Ersetzen von %20 durch + durchzuführen.

Beispiele

Das folgende Beispiel bietet die spezielle Kodierung, die in den UTF-8-Content-Disposition- und Link-Server-Antwort-Header-Parametern erforderlich ist (z. B. UTF-8-Dateinamen):

js
const fileName = "my file(2).txt";
const header = `Content-Disposition: attachment; filename*=UTF-8''${encodeRFC5987ValueChars(
  fileName,
)}`;

console.log(header);
// "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt"

function encodeRFC5987ValueChars(str) {
  return (
    encodeURIComponent(str)
      // The following creates the sequences %27 %28 %29 %2A (Note that
      // the valid encoding of "*" is %2A, which necessitates calling
      // toUpperCase() to properly encode). Although RFC3986 reserves "!",
      // RFC5987 does not, so we do not need to escape it.
      .replace(
        /['()*]/g,
        (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,
      )
      // The following are not required for percent-encoding per RFC5987,
      // so we can allow for a little better readability over the wire: |`^
      .replace(/%(7C|60|5E)/g, (str, hex) =>
        String.fromCharCode(parseInt(hex, 16)),
      )
  );
}

Kodierung für RFC3986

Das neuere RFC3986 reserviert !, ', (, ), und *, obwohl diese Zeichen keine formalisierten URI-Abgrenzungszwecke haben. Die folgende Funktion kodiert einen String für das RFC3986-konforme URL-Komponentenformat. Sie kodiert auch [ und ], die Teil der IPv6-URI-Syntax sind. Eine RFC3986-konforme encodeURI-Implementierung sollte sie nicht kodieren, was im encodeURI() Beispiel demonstriert wird.

js
function encodeRFC3986URIComponent(str) {
  return encodeURIComponent(str).replace(
    /[!'()*]/g,
    (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,
  );
}

Kodierung eines alleinstehenden Surrogats wirft einen Fehler

Ein URIError wird ausgelöst, wenn versucht wird, ein Surrogat zu kodieren, das nicht Teil eines Hoch-Tief-Paares ist. Zum Beispiel:

js
// High-low pair OK
encodeURIComponent("\uD800\uDFFF"); // "%F0%90%8F%BF"

// Lone high-surrogate code unit throws "URIError: malformed URI sequence"
encodeURIComponent("\uD800");

// Lone high-surrogate code unit throws "URIError: malformed URI sequence"
encodeURIComponent("\uDFFF");

Sie können String.prototype.toWellFormed() verwenden, das alleinstehende Surrogate durch das Unicode-Ersatzzeichen (U+FFFD) ersetzt, um diesen Fehler zu vermeiden. Sie können auch String.prototype.isWellFormed() verwenden, um zu überprüfen, ob ein String alleinstehende Surrogate enthält, bevor Sie ihn an encodeURIComponent() übergeben.

Spezifikationen

Specification
ECMAScript® 2025 Language Specification
# sec-encodeuricomponent-uricomponent

Browser-Kompatibilität

Siehe auch