JavaScript/encodeURI

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Eine URI darf nur aus Zeichen bestehen, deren Übertragung zwischen verschiedenen Betriebssystemen oder Zeichencodierungen sicher funktioniert. RFC 3986 definiert diese Zeichen, und alle Anwendungen, die URIs verarbeiten, müssen damit zurecht kommen. Zeichenketten in JavaScript können allerdings viel mehr Zeichen verwenden, und wenn eine URI diese Zeichen enthalten soll, müssen sie codiert werden. Dazu muss das Zeichen zunächst in eine UTF-8 Bytefolge übersetzt werden, und dann jedes dieser Bytes als ein Prozentzeichen gefolgt von der hexadezimalen Darstellung des Bytewertes verschlüsselt werden.

Die Funktion encodeURI() übernimmt diese Codierung. Sie lässt dabei die Zeichen unverändert, die laut RFC 3986 unreserviert sind oder eine Sonderbedeutung als Trennzeichen haben. Alle übrigen Zeichen werden prozentcodiert. Diese Funktion kann beispielsweise verwendet werden, wenn eine URL aus Teilen zusammengesetzt wurde, bei denen sicher gestellt ist, dass sie keine Zeichen enthalten, die in einer URL Sonderbedeutung haben. Ist das nicht sicher, so muss die Funktion encodeURIComponent eingesetzt werden.

Syntax

encodeURI(uriString)

  • uriString: eine Zeichenkette, die eine URI enthält.

Kodiert werden alle Zeichen außer den folgenden:

0 bis 9
A bis Z
a bis z
- _ . ~ ! * ' ( ) — (diese Zeichen bleiben auch von encodeURIComponent unberührt)
, / ? : @ & = + $ — (diese Zeichen werden von encodeURIComponent codiert)

Kodiert werden also beispielsweise deutsche Umlaute und Sonderzeichen, auch Leerzeichen, eckige und geschweifte Klammern usw.

{{Beachten|Mit der Einführung von IPv6 wurden auch die eckigen Klammern zu gültigen, reservierten Zeichen - sie dienen zur Markierung einer IPv6 Adresse. Wenn Sie encodeURI auf eine URI mit IPv6-Adresse anwenden, werden die eckigen Klammern codiert und die URI ist beschädigt. In diesem Fall müssen Sie die Codierung der eckigen Klammern rückgängig machen:

encodeURI(ipv6Uri).replaceAll("%5B", "[").replaceAll("%5D", "]")

Darüber hinaus wird bei Mozilla empfohlen, die Zeichen !, *, ', ( und ) ebenfalls zu codieren, weil RFC 3986 sie reserviert. Dazu müssen Sie auf das Ergebnis von encodeURI noch folgende Ersetzung anwenden:

replace(/[!'()*]/g, c => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)
Empfehlung: Seit dem Ende des Internet Explorers gibt es beim Zusammenbauen von URLs keinen Grund mehr, auf die URL- und URLSearchParams-Objekte zu verzichten. Sie führen die erforderlichen Codierungen automatisch aus. Setzen Sie URLs wenn möglich nicht durch einfache Stringverkettung zusammen.

Anwendungsbeispiel

Beispiel ansehen …
  function encode () { 
    let url = document.querySelector('a').href;
    document.querySelector('output').innerText = encodeURI(url);
  }
Das Beispiel liest mit querySelector('a').href die URL des Links aus und übergibt sie der Funktion encodeURI(). Der Rückgabewert der Funktion wird mit innerText ausgegeben.

Siehe auch

Weblinks