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
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
Kodierung für Content-Disposition- und Link-Header
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):
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.
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:
// 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 |