URL-Encoding

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von URL-Kodierung)
Wechseln zu: Navigation, Suche

URL-Encoding (URL-Kodierung, auch Prozentkodierung genannt) ist ein Mechanismus, der dazu dient, Informationen in einer URL unter bestimmten Gegebenheiten zu kodieren. Zur Kodierung werden nur bestimmte Zeichen des ASCII-Zeichensatzes verwendet.

Ohne diese Kodierung wären einige Informationen nicht in einer URL darstellbar. Beispielsweise wird ein Leerzeichen in aller Regel vom Browser als Ende der URL interpretiert, nachfolgende Zeichen würden ignoriert oder führten zu einem Fehler. Mit der URL-Kodierung kann ein Leerzeichen durch die Zeichenfolge ‚%20‘ übergeben werden. RFC 3986 definiert einen Standard, wie eine URI (und damit auch eine URL) syntaktisch aufgebaut sein sollte und unter welchen Bedingungen die URL-Kodierung Anwendung findet.

Auch für nicht im ASCII-Zeichensatz enthaltene Zeichen wird die URL-Kodierung mit dem Prozentzeichen eingesetzt. Hier gibt es jedoch bisher nur eine Empfehlung im RFC 3986, ein verbindlicher Standard fehlt noch.

Reservierte und nicht reservierte Zeichen[Bearbeiten | Quelltext bearbeiten]

URLs können aus folgenden Teilen bestehen:

https://max:muster@www.example.com:8080/index.html?p1=A&p2=B#ressource
\___/   \_/ \____/ \_____________/ \__/\_________/ \_______/ \_______/
  |      |    |           |         |       |          |         |
Schema   | Kennwort      Host      Port    Pfad      Query    Fragment
      Benutzer

Bestimmte Zeichen innerhalb dieses Ausdrucks kennzeichnen und trennen die einzelnen Segmente der URL und ermöglichen eine Zerlegung und Verarbeitung des Ausdrucks. Bei einem HTTP-Zugriff beispielsweise:

Weitere Zeichen haben spezifische Bedeutungen im Dokumentenpfad. Folgende Zeichen gelten als reserviert:

  • : / ? # [ ] @ : $ & ' ( ) * + , ; =

Folgende Zeichen sind nicht reserviert, besitzen also in einer URL keine vorgegebene Bedeutung:

  • Buchstaben: A-Z, a-z
  • Ziffern: 0-9
  • - . _ ~

Prozentdarstellung[Bearbeiten | Quelltext bearbeiten]

Eine URL besteht aus den genannten reservierten und nicht reservierten Zeichen. Sie darf keine anderen Zeichen enthalten. Es besteht jedoch prinzipiell der Bedarf, in URLs beliebige Byte-Folgen – also sämtliche Werte zwischen 0 und 255 – darstellen zu können. Zudem muss eine Möglichkeit existieren, reservierte Zeichen in einer URL derart schreiben zu können, dass sie ihre speziellen Bedeutungen verlieren (siehe auch Escape-Sequenz).

Die Prozentdarstellung von Zeichen trägt beiden Forderungen Rechnung. Ihr zugrunde liegt ein Kodierungsverfahren, das jedem Zeichencode eine dreistellige Zeichenkombination zuordnet, die mit dem Prozentzeichen beginnt dem die zweiziffrige hexadezimale Darstellung des Zeichencodes folgt.

Ein reserviertes Zeichen muss in einer URL in prozentkodierter Form geschrieben werden, wenn es an der Stelle, an der es sich befindet, eine besondere Bedeutung hat, diese aber im vorliegenden Kontext nicht haben soll. Nicht reservierte Zeichen können, sollten aber nicht, prozentkodiert werden. Bei anderen Zeichen (unter anderem Binärdaten) besteht meist gar keine andere Möglichkeit, als sie in einer URL in prozenzkodierter Form darzustellen (Ausnahme: reserviertes Zeichen ‚+‘ anstelle eines Leerzeichens im Query-String).

Beispiel:

Laut ASCII ist dem Zeichen ‚#‘ der hexadezimale Zeichencode 23 zugeordnet. Somit stellt der Ausdruck ‚%23‘ die prozent-kodierte Form des Zeichens ‚#‘ dar.

Die Interpretation von:

http://www.example.net/index.html?session=A54C6FE2#info

ist eindeutig. Es wurde ein URL-Parameter namens session definiert, dem der Wert A54C6FE2 zugewiesen ist, sowie der Dokumentenanker namens info angegeben. Das Zeichen ‚#‘ hat in dem vorliegenden Kontext die besondere Bedeutung, dass ihm der Name eines Dokumentenankers folgt. Soll es diese Bedeutung verlieren, d. h. dem URL-Parameter session der Wert A54C6FE2#info zugewiesen werden, so muss das Zeichen ‚#‘ in prozent-kodierter Form in der URL stehen:

http://www.example.net/index.html?session=A54C6FE2%23info

In der Praxis wird dieser Mechanismus nicht immer einheitlich angewendet. Es gibt jedoch Fälle, in denen die Verwendung nötig ist, beispielsweise beim Aufruf eines Ankers über einen Dereferrerdienst.

Relevante ASCII-Zeichen in Prozentdarstellung[Bearbeiten | Quelltext bearbeiten]

! " # $ % & ' ( ) * + , / : ; = ? @ [ \ ] { | }
%20 %21 %22 %23 %24 %25 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5C %5D %7B %7C %7D

Nicht-ASCII-Zeichen[Bearbeiten | Quelltext bearbeiten]

Auch für die Zeichen, die nicht im ASCII-Zeichensatz enthalten sind, werden die Bytes mit vorangestelltem ‚%‘ kodiert. Welche Bitfolge ein Zeichen jedoch darstellt, hängt von der zu benutzenden Zeichenkodierung ab. Es wird zwar vom RFC 3986 empfohlen, UTF-8 zur Kodierung zu benutzen, da dieses Unicode-Format für alle internationalen Zeichen benutzt werden kann, was UTF-8 zwar zur Quasi-Standardkodierung für URIs macht, aber einen expliziten Standard gibt es noch nicht. Um die URL kodieren zu können, muss man also wissen oder ahnen, welche Zeichenkodierung für die abzurufende Datei benutzt wurde oder welche Kodierung der Zielrechner benutzt. Aus diesem Grund ist es immer noch sinnvoll, nur auf Zeichen aus dem ASCII-Vorrat zurückzugreifen.

In der empfohlenen Kodierung UTF-8 wäre beispielsweise der Buchstabe ‚ö‘ (mit dem dezimalen Unicode-Zeichenwert 246) als ‚%C3%B6‘ dargestellt. Alle Zeichenwerte über 127 werden in zwei, drei oder vier Byte-Werten repräsentiert und dem entsprechend in die Prozent-Kodierung übernommen; wobei alle üblichen Schriftzeichen mit zwei Bytes repräsentiert werden Mehr Bytes benötigen lediglich ungebräuchliche Zeichen sowie Markierungen der Richtungsumkehr.

Mitunter wird immer noch ISO 8859-1 (Latin-1) für die Darstellung benutzt und dessen identischer dezimaler Zeichenwert 246 direkt mit Hilfe der Prozentkodierung in die URL eingefügt. Der Umlautö‘ wird dann als Wert ‚%F6‘ dargestellt.

Beide Darstellungsarten übermitteln dem Server aber eine andere Bitfolge. Obwohl beide nach ihrer Art richtig kodiert sind, liefert nur eine davon die gewünschte Datei und die andere meist nur eine Fehlermeldung. Bei einigen Servern – wie zum Beispiel denen der Wikipedia – wird jedoch versucht, die Kodierung zu ermitteln, so dass dann auf die richtige Datei weitergeleitet werden kann. Wenn es mit einer Kodierung nicht klappt, sollte man eine der anderen wahrscheinlichen Varianten probieren.

Eindeutigkeit[Bearbeiten | Quelltext bearbeiten]

Eine Unterscheidung zwischen zwei einzelnen kodierten ASCII-Zeichen (zum Beispiel ‚%23%23‘ für ‚##‘) und einem 2-Byte-UTF-8-Zeichen (zum Beispiel ‚%C3%B6‘) ergibt sich aus der Art, wie UTF-8 kodiert ist. Die einzelnen Bytes ergeben für sich allein keine gültigen ASCII-Zeichen, da hexadezimal C3 dezimal 195 entspricht und hexadezimal B6 dezimal 182. Da ASCII-Zeichen maximal den Wert 127 annehmen, können es auch keine zwei einzelnen Zeichen sein und die Zeichen werden zusammen als UTF-8-kodiert angenommen. Eine Verwechslung von UTF-8 und ASCII ist somit nicht möglich. Auf einer ähnlichen Basis können einige Server auch ermitteln, welche Kodierung in der URL verwendet wird. Eine weitere Eigenheit bei der Prozentkodierung von UTF-8-Zeichen ist, dass der erste Codewert immer ein Zeichencode der oberen Reihe (192–239) von ISO 8859-1 ist. Der darauffolgende Codewert (beziehungsweise die folgenden, falls mehr als zwei Byte) liegt immer zwischen 128 und 191. Ausnutzen kann ein Server dies nur, wenn die angeforderte URL überhaupt Zeichen mit Werten über 127 enthält. Andernfalls ist eine Unterscheidung nicht notwendig, da UTF-8 in den ersten 128 Zeichen (dezimaler Code 0 bis 127) deckungsgleich mit ASCII ist.

Zeichenkodierungen, die Werte über 127 erlauben, können nicht eindeutig unterschieden werden. ISO 8859-1 beispielsweise beinhaltet die Zeichen mit den hexadezimalen Codes C3 (Ã) und B6 (¶).

MIME-Typ[Bearbeiten | Quelltext bearbeiten]

Mit dem MIME-Typ application/x-www-form-urlencoded können URL-kodierte Daten gekennzeichnet werden. Bei der Übermittlung von Web-Formularangaben mittels der POST-Methode wird dieser MIME-Typ als Inhaltstyp (Content-Type) angegeben; gelegentlich auch mit expliziter Kodierung: application/x-www-form-urlencoded; charset: UTF-8.

Weblinks[Bearbeiten | Quelltext bearbeiten]