Hi,
- "&" und "=" codieren?
- Falls ja, in "%26" und "%3D"?
Grundprinzip der elektronischen Datenverarbeitung: Wenn Du einen Wert in einen Kontext bringst, musst Du ihn kontextspezifisch maskieren. Dieses Prinzip gilt immer und überall, in jedem Kontext, in- und außerhalb des Webs, bei jeder Sprache oder Technik, bei jedem System. Ausnahmen sind diejenigen Dinge, die man genau deswegen meiden sollte, weil sie Ausnahmen sind: Sie sind dadurch unverlässlich.
Wenn Du "&" und "=" in einen URL-Kontext bringst, etwa als Namen oder Wert eines Parameters, so musst Du sie wie von Dir genannt kodieren. Bringst Du sie in einen anderen Kontext, etwa HTML, so musst Du sie HTML-kodieren. Das wäre z.B. "&" für das "&" bzw. "=" für das "=".[1] Nutzt Du jedoch das "=" als Trennzeichen zwischen Parameternamen und -wert, so _bildet_ dieses Zeichen den Kontext - es ist ein Sonderzeichen, Du meinst es in seiner Sonderbedeutung. Eine Kodierung in dem Kontext, des es bildet, ist falsch.
- Falls ja, ist denn darauf Verlass, dass ein Script solch ankommenden Strings sauber wieder erkennt?
Das o.g. Grundprinzip hat notwendigerweise einen Umkehrschluss: Wenn Du einen Wert aus einem Kontext herausnimmst, musst Du ihn kontextspezifisch dekodieren. Die meisten Systeme machen dies automatisch, so dass der Punkt scheinbar entfällt. Ein DOM-Parser wird Dir die Inhalte eines Dokuments dekodiert zur Verfügung stellen, in PHP findest Du in $_GET['name'] den dekodierten Wert, SQL-Schnittstellen liefern Dir die Datenbankinhalte in dekodierter Form. Ebenso funktioniert es, wenn Du entsprechende Schnittstellen nutzt, um Werte irgendwo abzuliefern: _sie_ bringen ihn in den Kontext, sind also für die kontextspezifische Kodierung zuständig. Befüllst Du per JavaScript den nodeValue einer Text-Node mit '&', ist im Browser '&' zu sehen. Befragst Du eine Datenbank mit Bind-Variablen, anstatt das SQL-Statement als String selbst zusammenzubauen, übergibst Du die Abfragewerte in originaler Form. Hast Du eine setParam()-Methode, um eine URL zu erzeugen, so wird jedes '%xy' in einem '%25xy' resultieren.
Denn hier kann es durchaus sein, dass einzelne Parameter gewollt codiert sind und es auch bleiben sollen.
Wenn am Ende ein kodierter Wert herauskommen soll, so musst Du diesen als Original betrachten - und ihn kontextspezifisch kodieren.
- Macht Google es falsch?
Ja. Google spart fast zwanghaft Bytes und riskiert Fehler, von denen sie durch Erfahrung und Tests wissen, dass sie - zumindest im Moment - zu keinen Problemen führen bzw. nur zu solchen, die Google in Kauf zu nehmen bereit ist. Um es deutlich zu sagen: Google macht (bewusst) *viel* falsch.
url?a=rawurlencode('wert1')&b=rawurlencode('wert2').....
Beim Empfang nehme ich dann die Paare und verarbeite sie wie gewünscht weiter, also entweder raw oder decodiert. Wenn ich aber nun gezwungen wäre die Trenner & und = auch zu codieren, was dann?
Dann kodierst Du sie halt auch. Sie verlieren dadurch - im aktuellen Kontext - ihre Sonderbedeutung.
Cheatah
[1] In den meisten Fällen ist es möglich, Kodierungen auch für Zeichen zu forcieren, deren Standard-Kodierung sie selbst ergibt. Nötig ist es selten.
X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
X-Will-Answer-Email: No
X-Please-Search-Archive-First: Absolutely Yes