Start · Sprachen · JavaScript · Referenz · encodeURIComponent()

encodeURIComponent()

Funktion

Die Funktion <code>encodeURIComponent()</code> kodiert einen URI, indem bestimmte Zeichen durch UTF-8-Escape-Sequenzen ersetzt werden.

seit JavaScript ES3 / Baseline: alle Browser Kategorie: core

Signatur

encodeURIComponent(uriComponent)

Beschreibung

Die Funktion encodeURIComponent() kodiert einen URI, indem sie jedes Vorkommen bestimmter Zeichen durch eine, zwei, drei oder vier Escape-Sequenzen ersetzt, welche die UTF-8-Kodierung des Zeichens repräsentieren (vier Escape-Sequenzen nur bei Zeichen, die aus zwei Surrogat-Zeichen bestehen). Im Vergleich zu encodeURI() kodiert diese Funktion mehr Zeichen, einschließlich derjenigen, die Teil der URI-Syntax sind.

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

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

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

Im Vergleich zu encodeURI() escaped encodeURIComponent() eine größere Menge an Zeichen. Verwenden Sie encodeURIComponent() bei vom Benutzer eingegebenen Feldern aus Formularen, die an den Server gesendet werden — dies kodiert &-Symbole, die während der Dateneingabe versehentlich für character references oder andere kodierungs-/dekodierungspflichtige Zeichen erzeugt werden können. Schreibt ein Benutzer beispielsweise Jack & Jill, könnte das kaufmännische Und ohne encodeURIComponent() 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 sind Leerzeichen durch + zu ersetzen, sodass man einem encodeURIComponent()-Ersetzen ein zusätzliches Ersetzen von %20 durch + folgen lassen möchte.

Parameter

Name Typ Default Beschreibung
$uriComponent Pflicht string — Ein String, der als URI-Komponente (ein Pfad, Query-String, Fragment usw.) kodiert werden soll. Andere Werte werden in Strings konvertiert.

Rückgabewert

Typ
string
Beschreibung
Ein neuer String, der die übergebene uriComponent als URI-Komponente kodiert repräsentiert. Wirft einen URIError, wenn uriComponent ein einzelnes Surrogat (lone surrogate) enthält.

Beispiele

Kodierung für Content-Disposition- und Link-Header

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)
      // Das folgende erzeugt die Sequenzen %27 %28 %29 %2A (beachte, dass
      // die gültige Kodierung von "*" %2A ist, wodurch toUpperCase()
      // aufgerufen werden muss, um korrekt zu kodieren). Obwohl RFC3986 "!"
      // reserviert, tut RFC5987 dies nicht, daher müssen wir es nicht escapen.
      .replace(
        /['()*]/g,
        (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,
      )
      // Die folgenden sind laut RFC5987 nicht für Prozent-Kodierung erforderlich,
      // sodass wir eine etwas bessere Lesbarkeit über die Leitung erlauben können: |`^
      .replace(/%(7C|60|5E)/g, (str, hex) =>
        String.fromCharCode(parseInt(hex, 16)),
      )
  );
}

Kodierung für RFC3986

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

Kodierung eines einzelnen Surrogats wirft einen Fehler

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

// Einzelne High-Surrogate-Code-Unit wirft "URIError: malformed URI sequence"
encodeURIComponent("\uD800");

// Einzelne High-Surrogate-Code-Unit wirft "URIError: malformed URI sequence"
encodeURIComponent("\uDFFF");

// Wichtig · Fallstricke

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