URI-Codierung

Spezielle Regeln für die Internet-Adresszeile

Ein Internet-Befehlstext (Adresszeile ihres Browsers) muss festgelegten Regeln folgen und darf nur bestimmte Zeichen enthalten. Die URI-Syntax ('Grammatik') hat besondere Bedeutung für die Vergabe von Domain-Namen (UTF-5) und für die Codierung von CGI GET-Argumenten.
Zeichencodes PC-Codes für Buchstaben, Ziffern und Sonderzeichen
Decodierung Live-Beispiel zur Decodierung von Parametern
Codierung Live-Beispiel zur Decodierung von Parametern
URL Syntax Die Grammatik von Web-Resourcen
HTTP-URL Syntax Die Grammatik von Webseiten-Adressen
Querystring Syntax Die Grammatik für die Übergabe von Parametern
URI Programmierung URI-Strings in Programmiersprachen
Links Ausgewählte URI-Links Links zum Thema 'URI-Codierung'

Live Codierung - Decodierung

Eingabe mit HTML-Formular 
Textfeld (Variable txt)
Ein Aus
(Option / radio button rb1)
rot grün
(Auswahl / checkbox cb1,cb2)

Tragen sie Text ein, klicken sie entweder Submit oder Button.
Dieses Beispiel demonstriert Live, wie Daten von einem HTML-Formular (links) abgesendet, und von einer dynamischen Webseite (rechts) empfangen und decodiert werden.

HTML-Formular

Formular <form>

Das Beispiel rechts zeigt (vereinfacht) den HTML-Quelltext für ein Formular.
Das <form>-Element umschließt alle Eingabe-Elemente, Kommentare usw- (hier mit ... symbolisiert).
HTML-Formular
<form name="f1" method="get" action="uri_decode.php">
...
</form>

Attribut name

Jedes Formular sollte normalerweise einen eindeutigen Namen erhalten. Zwecks Kompatibilität mit DOM-Methoden ist es sehr empfehlenswert, auch ein id-Attribut mit dem gleichen Namen einzusetzen.

Gleich lautende Attribute id und name
id="f1" name="f1"

Methode (GET oder POST)

Zum Übersenden der Daten stehen 2 Methoden zur Verfügung. Die Unterschiede sind für einfache Fälle unerheblich. Wählen sie im Zweifel GET, dann werden die übergebenen Daten in der Browser-Adresszeile der Ziel-Seite angezeigt und lassen sich leichetr debuggen.
Methoden (entweder - oder):
method="get"
method="post"

Action = Ziel-Adresse

Mit dem Attribut action wird die Adresse des Ziels angegeben - normalerweise eine dynamische Webseite.
(In Sonderfällen gibt es ganz andere Anwendungen).
Eine etwas präzisere Definition:
Das Ziel ist ein Server-Programm, welches die Daten empfängt, und als Reaktion eine maßgeschneiderte Webseite erzeugt und zurücksendet.
Das Programm ist meistens in einer typischen Webserver-Programmiersprache verfasst, z.B. Perl oder PHP.
Die von einem HTML-Formular umschlossenen Eingabe-Elemente werden im nächsten Kapitel vorgestellt. Jede Webseite kann beliebig viele Formulare enthalten. Jedes <form>-Element muss lediglich einen eigenen eindeutigen Namen erhalten.
Mehr als 1 Formular wird allerdings nur selten eingesetzt.

Formular Eingabe-Elemente

Die hier gezeigten HTML Elemente dienen zur (manuellen) Eingabe von Daten. Alle Elemente sind optional.
Tipp: Bringen sie bei allen Elementen Kommentare und Beschriftungen an, damit ihre BesucherInnen erfahren, welche Daten erwartet werden.
Alle Eingabe-Elemente müssen sich innerhalb eines <form></form>-Elements befinden. Die enthaltenen Daten werden beim Absenden (submit) des Formulars gemeinsam abgesendet.

Anordnung

Das Beispiel rechts zeigt (vereinfacht) den HTML-Quelltext für ein Formular.
Das <form>-Element umschließt alle Eingabe-Elemente und alle dazu gehörenden Beschriftungen und Kommentare.
HTML-Formular
<form name="f1" method="get" action="uri_decode.php">
<input type="text" name="txt" /> Text<br />
<input type="radio" name="rb1" value="ein" />
...
</form>

Text-Eingabe

Dieses Element wird am Häufigsten verwendet. Es dient zur Eingabe von beliebigem Text - auch Leerzeichen, Sonderzeichen, Unicode-Zeichen usw.
Jedes Text Eingabe Element muss einen eindeutigen Namen (hier txt) erhalten. Dieser Name wird später als Variablen-Name an das Ziel weitergegeben. Der eingetragenen Text wird als Wert der Variablen übergeben.
Ein Formular kann beliebig viele Elemente zur Text-Eingabe enthalten. Diese müssen sich lediglich in ihren Namen unterscheiden.
Element <input> mit Attribut type="text"
<input type="text" name="txt" /> Text

Beispiel:
Wenn sie den Text abc eintragen, werden die Daten dieses Eingabe-Feldes als txt=abc an das Ziel übergeben.

Options-Felder (radio buttons)

Dieses Element besteht aus mehreren zusammengehörenden Teilen, von denen jeweils nur einer ausgewählt sein kann. Die Auswahl eines Elements schaltet alle anderen Elemente ab.
Alle zusammengehörenden Options-Felder müssen den gleichen Namen erhalten.
Jedes Formular kann beliebig viele Gruppen von Options-Feldern enthalten. Jede Gruppe muss andere Namen verwenden.
Element <input> mit Attribut type="radio"
<input type="radio" name="rb1" value="ein" /> Ein
<input type="radio" name="rb1" value="aus" /> Aus

Beispiel:
Wenn sie die Option aus wählen, werden die Daten rb1=aus an das Ziel übergeben.

Schaltkästchen (checkboxes)

Jedes dieser Elemente kann durch Klick ein/aus geschaltet werden, und zwar unabhängig von allen anderen Elementen. Daher muss jede checkbox einen eindeutigen Namen erhalten.
Ein Formular sendet nur die Daten markierte Kästchen.
Element <input> mit Attribut type="checkbox"
<input type="checkbox" name="cb1" value="rot" />

Beispiel:
Wenn sie dieses Kästchen markieren, werden die Daten cb1=rot an das Ziel übergeben. Ansonsten wird die Variable cb1 nicht gesendet.
Weitere Eingabe-Elemente sind z.B. Auswahl-Listen
Weitere Attribute erlauben zusätzliche Optionen und vor allem die präzise Formatierung (CSS kann verwendet werden).

Vorbelegung

In der Praxis ist es meist angenehm, wenn jedes Eingabe-Feld bereits mit einem Standard (Vorgabe)-Wert ausgefüllt bzw. markiert ist. In diesem Fall müssen die AnwenderInnen nur die abweichenden Daten ändern.
Details zu Eingabe-Elementen bei SelfHTML  

Formular absenden (submit)

Einfache Formulare werden mit Bildschirm-Tasten (buttons) abgesendet.  

Submit-Button

Das Beispiel rechts zeigt (vereinfacht) den HTML-Quelltext für ein Formular mit einem Absende-Button.
Die Beschriftung des Buttons lautet Absenden.
Beim Absenden werden alle Daten der im Formular enthaltenen Eingabe-Elemente an das Ziel übergeben.
HTML-Formular
<form name="f1" method="get" action="uri_decode.php">
...
<input type="submit" value="Absenden" />
</form>

<button>-Element

Dieses Element sieht genauso aus wie ein Submit-Button, ist jedoch wesentlich flexibler.
Ein <button> kann an jeder Stelle einer Webseite verwendet werden, auch außerhalb von Formularen.
Ein <button> kann beliebige Aufgaben übernehmen, u.a. das Absenden von Formularen, aber auch den Start beliebiger anderer Javascript-Funktionen.
Element <button> zum Absenden des Formulars f1
<button onclick="document.f1.submit()">
Absenden
</button>
Element <button> zur Anzeige eines Alarm-Fensters:
<button onclick="demo_1()">
Klick
</button>
Hier die beschriebenen Buttons Live:

Javascript

Professionell erstellte Formulare werden besser mit Javascript abgesendet. Die Programmierung mit Javascript ist aufwändiger, erlaubt jedoch eine Kontrolle der eingegebenen Daten (Validierung) vor dem Absenden.
Modell einer JS-Funktion für Validierung und Absenden eines Formulars:
function my_submit() {
var ok=validate();
if(ok) {document.f1.submit();}
else {alert("Fehler");}
}

Formular-Daten Lesen und Schreiben mit Javascript

Zum automatischen Eintragen von Daten und zum Lesen der Daten zwecks Validierung kann Javascript auf jedes Eingabe-Element zugreifen.
Daten aus dem Text-Feld name="txt" lesen:
var x = document.f1.txt.value;
Daten schreiben:
document.f1.txt.value = "Neuer Text"

(Verstecktes) Formular zur Codierung verwenden

Javascript

Man kann Daten mit Javascript aufbereiten und absenden. Dazu braucht man kein HTML-Formular. Allerdings muss man sich selbst um die Codierung der Daten, Zusammenstellung des URI-Textes und das Absenden kümmern.

Viel bequemer ist es allerdings, für Codierung und Absenden der Daten ein verstecktes Formular zu verwenden. Dieser Trick wird hier gezeigt.

So kann man Eingabe-Felder verstecken. Das Element funktioniert genauso wie type="text" wird jedoch nicht angezeigt.
Ein verstecktes Formular-Feld:
<input type="hidden" name="h1">

Mit der CSS Eigenschaft display kann man die Anzeige beliebiger Elemente abschalten - auch ganzer Formulare. Das <form> funktioniert genauso wie ein sichtbares Formular.
So versteckt man ein ganzes Formular mit allen enthaltenen Eingabe-Elementen:
<form style="display:none;">
...
</form>

Formular-Daten eintragen

Zum automatischen Eintragen von Daten kann Javascript auf jedes Eingabe-Element zugreifen.
Daten schreiben:
document.f1.txt.value = "Neuer Text"

Formular Absenden

So wird ein Formular mit Javascript abgesendet.
Absenden eines Formulars mit Javascript:
document.f1.submit();}

URI-Regeln

Es gibt verschiedene Möglichkeiten, den Text für die Anforderung einer Webseite und die darin übergebenen Argumente zu codieren.
Hier werden jene Regeln beschrieben, die angewendet werden, wenn ein HTML <form>-Formular mit einem gängigen Browser und der GET-Methode abgesendet wird.
 
Allgemeine Form:
<scheme>://<user>:<password>@<host>:<port>/<path>?<query>;<argument>=<value>&<argument>=<value>#<fragment>
Ein URI-String besteht aus folgenden Teilen - jeder Teil ist optional:
Adresse - absolut, relativ oder Internet (http://, ftp://, ...)
Argumente - Text-String, eingeleitet durch ein ?-Zeichen.
Mehrere Argumente werden voneinander durch &-Zeichen getrennt.
Jedes Argument besteht aus den Teilen name und wert, getrennt durch = Zeichen.
Beispiel: Dieser Argumente-String übergibt die Daten der Variablen txt und zal:
?txt=abc&zal=123
Anker - Text-String, eingeleitet durch ein #-Zeichen.

Die Codierung der Zeichen ist leider nicht systematisch, vermutlich aus historischen Gründen.
Die 'URI-Maskierung' besteht aus einem %-Zeichen und einem 2stelligen Hexadezimal-Code. URI-Maskierung des Zeichens U+3C (das < Zeichen) erzeugt z.B. den String "%3C".
Hier die Codierung der Unicode-Zeichen:
Die 32 'nicht-druckbaren ASCII-Steuerzeichen' Zeichen U+00..U+1F werden normalerweise in URI-Strings nicht verwendet. Falls doch, werden sie URI-codiert zu "%00".."%1F".
Das ASCII-Sonderzeichen U+20 (blank, Leerzeichen) wird mit einem + Zeichen codiert.
Die 16 ASCII-Zeichen U+20..U+2F werden URI-maskiert, mit Ausnahme von U+20 (blank, s.o.); U+2A (*), U+2D (-) und U+2E (.), diese 3 Zeichen werden nicht codiert, sondern im Klartext verwendet.
Die 80 ASCII-Zeichen U+30..U+7F (ASCII) werden nicht codiert, sondern im Klartext verwendet, mit Ausnahme von 16 Sonderzeichen, die URI-maskiert werden: U+3A (:), U+3B (;), U+3C (<), U+3D (=), U+3E (>), U+3F (?), U+5B ([), U+5C (\), U+5D (]), U+5E (^), U+60 (`), U+7B ({), U+7C (|), U+7D (}), U+7E (~), U+7F (delete).
Die 128 Zeichen U+80..U+FF werden ausnahmslos URI-maskiert zu "%80".."%FF".
Die 65280 Zeichen U+0100..U+FFFF werden doppelt codiert: Zuerst wird HTML-codiert, das ergibt "&#256;" bis "&#65535;"
Der HTML-Code wird danach URI-maskiert, das ergibt %26 (für &), %23 (für #), eine Dezimalzahl 256..65535 und %3B (für ;), insgesamt die Codes "%26%23256%3B" bis "%26%2365535%3B"
Zeichen >U+FFFF können nicht URI-codiert werden bzw. werden von derzeit gängigen Browsern falsch codiert.
Die Sender-Webseite ist verantwortlich für die korrekte URI-Codierung des URI-Strings. Dafür gibt es mehrere Möglichkeiten:

Die einfachste Möglichkeit ist, ein HTML-Formular zu erstellen. Der Inhalt sämtlicher darin enthaltener Felder wird beim Klicken der Submit-Taste URI-Codiert, so wie links beschrieben. In den Formular-Feldern können alle Unicode-Zeichen verwendet werden.


Javascript ermöglicht es, die Argumente zu programmieren. Wenn ein HTML-Formular besteht, dann ist es meistens günstig, die Argument-Daten in die Felder des Formulars zu schreiben und dieses abzusenden.

Mit Javascript können programmierbare Argumente auch ohne HTML-Formular versendet werden. In diesem Fall wird der Eigenschaft href des eigenen Fensters oder dem Attribut src eines anderen Fensters ein entsprechend codierter URI-String zugewiesen.
Es ist möglich URI-Strings direkt in HTML-Links zu verwenden. Damit können fix vorprogrammierte Argumente ohne HTML-Formular versendet werden:
<a href="test.htm?txt=abc">abc</a>
<a href="test.htm?txt=A+B">A B</a>
<a href="test.htm?txt=A%2BB%3CZ%3E">A+B&lt;Z&gt;</a>
<a href="test.htm?txt=x%3Fy%263">x?y&amp;3</a>
<a href="test.htm?txt=%C4%D6%DC">&Auml;&Ouml;&Uuml;</a>
<a href="test.htm?txt=%E4%F6%FC%DF">&auml;&ouml;&uuml;&szlig;</a>
<a href="test.htm?txt=%26%23945%3B%26%23946%3B%26%23947%3B">&alpha;&beta;&gamma;</a>
<a href="test.htm?txt=%26%239650%3B%26%239679%3B%26%239632%3B"">&#x25B2;&#x25CF;&#x25A0;</a>
Mögliche Werte für <scheme> nach Standard RFC 1738
SchemaBezeichnungAnmerkungen
ftpFile Transfer Protocol Benutzername, Kennwort, FTP-Hostname, Port, Zugriffspfad, Typcode
gopherGopher Protocol Gopher-Server, Portnummer, Pfad (veraltet unhd selten)
httpHypertext Transfer Protocol Web-Hostname, Port, Zugriffspfad, Anfrage, Fragment
mailtoE-Mail Adresse E-Mail Adresse, Argument-Wert-Paare, Beispiel-Muster: "mailto:<mailaddr>?subject=<subject>&cc=<mailaddr>"
newsUSENET news Newsgroup-Artikel oder News-Gruppen
nntpUSENET news mit Network News Transfer Protocol Host-Name, Portnummer, Newsgruppe, Artikel in dieser Gruppe
prosperoProspero Host-Name, Portnummer, Host-spezifisches Objekt, Feld, Wert
telnetFür interaktive Sitzungen Benutzername, Kennwort, Host-Name, Portnummer
waisWide Area Information Servers Hostname, Portnummer, Datenbank, Abfrage
fileHost-spezifische Dateipfade Host-Name, Dateipfad auf diesem Host

Decodierung - Live Beispiel

An dieses Script wurden keine Argumente übergeben. Geben sie im nächsten Absatz einen Text ein und kontrollieren sie Codierung und Decodierung.
Details zur 'Grammatik' des QUERYSTRING (Parameter-Text) finden sie auf dieser Webseite im Absatz 'Querystring Syntax'. Details zur Übergabe von Argumenten an PHP-Scripts finden sie in einem eigenen Kapitel dieses Webs.

Codierung - Live Beispiel


Tragen sie einen beliebigen Text in das Eingabefeld text1 (links) ein und klicken sie 'Absenden'.
Ihr Text in Formular 'form1', Feld 'text1' wird beim Absenden (action) an das PHP-Script 'uri.php' (diese Webseite) automatisch codiert. Ihr Browser erzeugt den QUERYSTRING, jenen Text, welcher an die Adresse der Ziel-Webseite angehängt wird, um Parameter (ihren Text) zu übergeben. HTML-Quelltext:
<form name="form1" method="get" action="uri.php">
  <input type="text" name="text1">
</form>
In HTML-Formularen kann man auch → Unicode-Zeichen verwenden. Man kann beliebige Texte mit Sonderzeichen in das Eingabefeld kopieren oder die Demo-Links (rechts) klicken. Das sollte mit allen gängigen Browsern funktionieren - falls nicht, verwenden sie → UTF-8 Codierung für die gesamte Sender-Webseite. Test mit €uro, griechischen oder cyrillischen Zeichen, Pfeilen und geometrischen Formen, ...
Unicode-Zeichen >U+00FF werden 'doppelt maskiert' (s.u. <querystring>-Regeln für <wert>)

URL Syntax - Grammatik von Web-Adressen

URL (Uniform Resource Locators)
ist die 'alte' Bezeichnung für Texte (Strings) zur Codierung einer Web-Resource, z.B. einer Web-Adresse wie http://pstrainer.topsoft.at. Die URL-Syntax ist in den Standards RFC1738 und RFC1808 festgelegt.
URI (Uniform Resource Identifiers)
ist ein neuer Begriff, der zusätzlich weitere Resourcen ('Names') einschließt. URI ist in der W3C-Definition von CSS2 (Cascading Style Sheets) festgelegt.

Aufbau:

Jede URI besteht aus 3 Teilen <scheme>:<scheme-spefischer Teil>
Beispiel http://pstrainer.topsoft.at
<scheme> = http
Doppelpunkt:
Spezifischer Teil = //pstrainer.topsoft.at

<scheme>

Für <scheme> sind nur folgende Zeichen erlaubt: 0..9, a..z und die 3 Zeichen +.-
Die Liste der schemes umfasst derzeit u.a. http, ftp, mailto, news, nntp, file, telnet, gopher, wais, ...

Scheme-spezifischer Teil

Für den spezifischen Teil (unterschiedlich, je nach <scheme>) sind prinzipiell alle druckbaren → ASCII-Zeichen zulässig, also vom Leerzeichen (Code 32.=#20) bis zur Tilde (Code 126.=#7E), nicht jedoch Zeichen >127 wie z.B. äöüß
Jedes Zeichen mit Code 0..255=#00..#FF kann alternativ mit dem Zeichen % und einer 2stelligen Hexadezimalzahl maskiert werden, z.B. %41 für A (Code 64.=#41).
Unsichere Zeichen:
Das Leerzeichen (Code 32.=#20) und die Zeichen <>"#%{}|\^~[] müssen maskiert werden wie oben beschrieben, z.B. %20 für das Leerzeichen.

Reservierte Zeichen:
Einige Zeichen werden als URL-Steuerzeichen verwendet ;/?:@=& und müssen maskiert werden, z.B. %3F für das Fragezeichen.
Direkt codierte Zeichen
Nach Abzug der Steuerzeichen, unsicheren Zeichen und reservierten Zeichen bleiben nur folgende Zeichen, die 'direkt' in URL-Strings codiert werden können: 0..9, A..Z, a..z und die Zeichen $-_.+!*'
Details zum besonders wichtigen <scheme> HTTP finden sie im nächsten Absatz.

Pfade

Die Angabe von Pfaden erfolgt in der Form <dir>/.../<dir>/<name>, wobei <dir> für ein Verzeichnis steht und <name> für einen Datei-Namen.

Für jede Stufe 'aufwärts' in einem hierarchischen System wird ../ eingesetzt.

HTTP-URL Syntax

HTTP

Ein HTTP-URL hat die allgemeine Form
http://<host>:<port>/<path>?<querystring>#<fragment>
 
Host
ist eine IP-Adresse oder ein Domain-Name. Der <host> muss immer angegeben werden, danach wird der gewünschte Server gesucht, z.B. bei HTTP ein Webserver, bei FTP ein FTP-Server, usw. mit der angegebenen Adresse.
Beispiele:
Port:
Der Port (optional) ist eine symbolische Adresse, welche den Datenstrom innerhalb des Bereichs einer IP-Adresse (des Absender-PC)dirigiert. Wenn z.B. mehrere Programme ihres PC gleichzeitig mit dem Internet kommunizieren, dann verwendet jedes dieser Programme einen eigenen Port. Eintreffende Daten-Pakete werden zum jeweiligen Port, d.h. zum richtigen Programm weitergeleitet.

Wenn der <port> nicht angegeben wird, so wird für jedes <scheme> ein Standard-Port angenommen, für HTTP ist das port=80
Pfad:
Mit dem <path> wird ausgewählt, welches Dokument der adressierte Server zurücksenden soll. Wenn der <path> nicht angegeben ist, entscheidet der Server, ob und was zurückgesendet wird. Bei einem Webserver nennt man jene Webseite, die ohne spezielle Anforderung gesendet wird, 'Homepage'. Die Homepage wird in der Konfiguration des Webservers festgelegt, bei Apache z.B. mit der Zeile
DirectoryIndex index.html index.html.var index.htm index.php

Das Startverzeichnis eines Webs muss eine Datei dieses Namens enthalten. Wenn sie ein Web bei einem Provider publizieren, dann finden sie den Namen der Start-Datei in den Einstellungen bzw. Vorgaben. Meist werden Namen wie index.html oder ähnlich verwendet.
QUERYSTRING:
Wenn das angeforderte Dokument ein Script (z.B. dynamische Webseite, *.php, *.pl, ...) ist, dann kann man Daten (Parameter) an das Script-Programm übergeben. Der <querystring> enthält alle Parameter (Namen und Werte), welche mit der GET-Methode an ein Ziel-Script übergeben werden sollen.

Für den <querystring> gelten eigene Syntax-Regeln (s.u.). Das trennende Fragezeichen ? fällt weg, wenn kein <querystring> enthalten ist.
Anker:
Ein <fragment> ist ein Link innerhalb der adressierten Webseite (Anker). Damit kann man Sprungziele an bestimmten Stellen längerer Webseiten ansteuern.

Fast alle Seiten dieses Webs enthalten Anker, z.B. <a name="top"></a> oder <a name="bot"></a> . Das Trennzeichen # fällt weg, wenn kein <fragment> enthalten ist. In diesem Fall zeigt der Browser den Anfang der Webseite.
iDNS:
Im Zuge der dringend notwendigen Internationalisierung ist es notwendig, die engen (US)-Zeichen-Grenzen der HTTP-Syntax zu erweitern. Derzeit werden verschiedene Algorithmen (→ UTF-5) diskutiert und bereits teilweise verwendet, um Internationalisierte Domain-Namen (iDNS) zu verwenden. Damit ist es möglich, auch in Europa (lateinische Sonderzeichen, griechische und cyrillische Zeichen) und in asiatischen Bereichen mit nicht-lateinischen Zeichen leicht verständliche Domain-Namen zu verwenden.

Der kurzfristige Ansatz ist die aufwändige Codierung / Decodierung von 21-Bit Unicode Zeichen in 5-Bit DNS-zulässige Zeichen. So können für Menschen lesbare Domain-Namen verwendet werden, die interne Verarbeitung verwendet weiterhin 'alte' Zeichen.
Langfristig sollte besser die gesamte Internet-Kommunikation auf Unicode-Zeichen umgestellt werden.

QUERYSTRING - Syntax

Ein QUERYSTRING enthält Daten (Parameter), welche an das aufgerufene Script übergeben werden. Damit ist es möglich, Text-Daten an eine dynamische Webseite (z.B. *.php, *.pl, ... ) zu übergeben.
Zahlen werden (in Form von Ziffern) ebenfalls als Texte codiert. Statische Webseiten (*.htm, *.html, ... ) können keine Parameter verarbeiten, die allfällige Übergabe von Daten bleibt in diesem Fall wirkungslos.
Der QUERYSTRING wird nach den unten angeführten Regeln codiert und mit einem Trennzeichen ? an die Adresse der gewünschten Webseite angehängt.
Alle Parameter-Daten werden als Paare der Form <name>=<wert> dargestellt.
Mehrere Paare werden voneinander mit je einem Zeichen & getrennt.
Die maximale Länge des gesamten URL-Strings (inkl. http..) beträgt 1024 Zeichen.

Regeln für <name>

Ein <name> darf kein Leerzeichen enthalten.
Ein <name> muss mit einem Zeichen A..Z,a..z beginnen (nicht mit einer Ziffer 0..9 ).

Regeln für <wert>

In <wert> enthaltene Leerzeichen werden mit dem Zeichen + oder mit %20 codiert.
Sonderzeichen wie &<>/? werden maskiert, z.B. das Fragezeichen ? mit %3F
Beispiel:
Die Zuweisung a=123 wird zum <querystring> 'a=123' bzw. in einer URL zu http://test.com/testseite.php?a=123
Beispiel:
Die beiden Zuweisungen a=12% und b="zwei Worte" werden zum <querystring> a=12%25&b=zwei+Worte
Ein wenig bekannter Trick zur URI-Codierung beliebiger → Unicode-Zeichen ist die 'doppelte Maskierung': Zuerst werden Unicode-Zeichen → HTML-maskiert, danach URI-maskiert. Beispiel:
Aus dem griechischen α wird zuerst der HTML-Code &#945; danach der URI-Code %26%23945%3B
Details zu den Hexadezimal-Codes der ASCII-Zeichen Testen sie die Codierung und Decodierung von <querystring> Live mit dem HTML-Formular dieser Seite (s.o.).

URI-Codierung in Programmiersprachen

Alle Programmiersprachen, die zur Erstellung dynamischer Webseiten verwendet werden, bieten Funktionen zur Codierung / Decodierung von URI-Strings und /oder zur Decodierung übergebener → CGI-Parameter der Methoden GET und POST. Tipp:
Verwenden sie im Zweifel bei der Programmierung nur absolute Pfad-Angaben, diese werden von allen Programmiersprachen unterstützt.
Tipp:
Verwenden sie alternativ die 'doppelte Maskierung' so wie in den <querystring>-Regeln für <wert> (s.o.) gezeigt.

Java & Javascript

Die Funktionen sind meist schlecht dokumentiert, daher rechts eine Live-Javascript Tabelle ausgewählter Zeichen.
Zur Codierung / Decodierung stehen diese 3 jeweils symmetrischen Funktions-Paare zur Verfügung: escape - unescape (Spalte esc), encodeURI - decodeURI (Spalte encU), encodeURIComponent - decodeURIComponent (Spalte encUC).
Alphanumerische Zeichen 0..9, A..Z a..z werden von allen Funktionen unverändert übernommen.
Die Live-Tabelle zeigt das Verhalten bei → ASCII Sonder- und Steuerzeichen c<128: Bei Maskierung wird ein Hex-Code %XX verwendet.
Für Zeichen 127<c<256 ( #7F<c<#FF, z.B. Umlaute) wird entweder maskierter → ISO-Code oder maskierter → UTF-8 Code verwendet.
Für → Unicode-Zeichen 255<c<=65535 (#FF<c<=#FFFF) wird entweder ein HexCode der Form %uXXXX oder maskierter → UTF-8 Code verwendet. Mit den Javascript-Funktionen lassen sich daher alle → Unicode-Zeichen c<=U+FFFF verarbeiten.
Zeichen c>U+FFFF ergeben ohne Warnung fehlerhafte Codes.

a = "Test +&.€";
u = escape(a);
// u="";
u = encodeURI(a);
// u="";
u = encodeURIComponent(a);
// u="";

PHP

Die Funktionen urlencode bzw. urldecode codieren/decodieren einen String nach den Regeln für <querystring>s (Leerzeichen und Sonderzeichen).
Die Funktionen rawurlencode bzw. rawurldecode codieren/decodieren einen String nach URL-Regeln (nur Sonderzeichen).
Funktion parse_str wird besser nicht verwendet, da sie ein Sicherheits-Risiko darstellt.

Ab Version 5 steht Funktion http_build_query zur Verfügung. Sie erstellt aus einem Array (hier $qa) aller Parameter direkt den gesamten <querystring> (hier $qs)
Funktion parse_url zerlegt einen kompletten oder partiellen URL-String in ein Array seiner Bestandteile [scheme, host, port, user, pass, path, query, fragment
Die weitere Zerlegung des Pfades erfolgt mit Funktion pathinfo in die Teile [dirname, basename, extension] (hier Array $pa), die Aufarbeitung des <querystring> mit den Funktionen urldecode und preg_split

Details zur Decodierung von Parametern mit PHP.
$a = "12%";
$b = "2 Worte";
$qs = "a=".urlencode($a)."&b=".urlencode($b);
// $qs = "a=12%25&b=2+Worte";

$t = urlencode($qs);
// $t = "a=12%&b=2 Worte ";

$qa = array('a'=>'12%', 'b=>'2 Worte');
$qs = http_build_query($qa);
// $qs = "a=12%25&b=2+Worte";

$u="http://test.com/dir/path.php?$qs#top";
$ua = parse_url($u);
// $ua['scheme'] = "http";
// ...
// $ua['fragment'] = "top";
$pa = pathinfo($ua['path']);
// $pa['dirname'] = "/dir";
// $pa['basename'] = "path.php";
// $pa['extension'] = "php";
$qs = urldecode($ua['query']);
$qa = preg_split("/&/",$qs);
// $qa[0] = "a=12%";
// $qa[1] = "b=2 Worte";

Perl

Das Modul URI bietet klar und übersichtlich alle benötigten Funktionen zum Codieren und Decodieren. Die Methoden lesen bzw. schreiben die einzelnen URI-Teile je nach Verwendung.
Details im Perl-Manual unter Reference | Modules | URI.
use URI;
$u = URI->new();
# Codierung:
$u->scheme("http");
$u->host("test.com");
$u->path("/dir/path.pl");
$u->query_form(a=>'12%',b=>'2 Worte');
$u->fragment("top");
print "URI-string = ".$u->as_string."\n";
# Decodierung:
print "scheme = ".$u->scheme."\n";
print "host = ".$u->host."\n";
print "port = ".$u->port."\n";
print "path = ".$u->path."\n";
print "query = ".$u->query."\n";
print "fragment = ".$u->fragment."\n";

Ausgewählte Links zum Thema 'URI-Codierung'

W3C - Naming and Adressing URIs, CSS2-URL-URI, Multilingual Forms,
IANA - List of URI schemes, URN namespaces,
IETF - Internationalized Resource Identifiers (IRIs)
RFC 3986, Uniform Resource Identifiers (URI): Generic Syntax
RFC 1738, Uniform Resource Locators (URL)
RFC 1808, Relative Uniform Resource Locators
RFC - RFC1738 (URL, 1994) von Tim Berners-Lee (CERN) et al., RFC1630 (URI, 1994)
Cheryl & Roy Fielding - URI Generic Syntax von Tim Berners-Lee

Letzte Änderung dieser Seite: 2012-03-02 21:47:11