2010-07-02 8 views
6

Scheinen wie eine ganz einfache Frage hier:Encoding URL-Komponenten mit einem Ampersand &

ich ein Programm habe, wo jemand einen String M&S in einer Form eintritt und eine Abfrage ausgeführt wird. Ich verstehe die & ist ein reserviertes Zeichen und muss daher codiert werden. Das Problem ist, dass es in einigen Kontexten zweimal zu kodieren scheint.

Wenn die URL in einem Javascript onClick Ereignis verwendet wird, scheint normal URL-Codierung in Ordnung (hier kann der Bediener auf einen Spaltenkopf klicken, um zu sortieren) zu arbeiten:

<td onClick="AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=161')"> 

Wenn jedoch die URL verwendet wird, in einem Anker (obwohl der Anker verwendet AJAX tatsächlich), so scheint es Codierung müssen zweimal:

<a href="javascript:AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147')" title='Refresh'>Refresh</a> 

beide der oben genannten Beispiele funktionieren. Sie sind jedoch handgenerierte Testfälle. Leider weiß ich in der Anwendung, wenn ich die URL tatsächlich erzeuge, nicht, wie sie verwendet wird. Wenn ich den URL-Parameter einmal codiere (M%26S), funktioniert es in onClick. Aber auf diese Weise im Anker verwendet, sieht der Server die URL als ...Qry147=M&S&sortmethod1=147... - so muss es uncodiert worden sein, bevor es an den Server zurückgegeben wird.

Wenn ich es zweimal codieren (M%2526S), funktioniert der Anker, aber für die onClick sieht der Server ...Qry147=M%2526S....

Ich habe das Gefühl, dass mir hier etwas fehlt. Gibt es eine Möglichkeit, dies in beiden Fällen gleich zu machen?

+0

Können Sie ein Beispiel geben, wie Sie tatsächlich diesen Wert verwenden? – Gumbo

+0

Sorry, die Frage wurde nicht richtig angezeigt. Ich denke, ich muss daran arbeiten, meinen Kommentaren zu entgehen! Moment mal, ich werde versuchen, es zu bearbeiten. – asc99c

+0

Quelltext anzeigen ... Über Initiativinitiative sprechen! :) Die Frage wird nun korrekt angezeigt, entschuldige mich dafür. – asc99c

Antwort

8

Wenn Sie den gesamten HTML-Text mit einfachen Schritten erstellen, werden einige der Schwierigkeiten verschwinden. Also, indem Sie Ihre am Beispiel, möchten Sie die folgende Abfrage-Parameter kodieren:

M&S 

Wenn Sie diese Zeichenfolge als Abfrage-Parameter in einer URL eingebettet werden, man muss es urlencode, wie Sie bereits wissen. Die urlencodierte Zeichenfolge ist M%26S.Die vollständige URL sieht dann wie folgt aus:

http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=147 

Jetzt wird diese URL in JavaScript-Code eingebettet ist, und in diesem Fall brauchen Sie nur einfache Anführungszeichen an beiden Enden:

'http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=147' 

Der gesamte JavaScript-Code sieht aus wie dies:

AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147') 

Nun ist dieser ganze Text wird in einem HTML-Kontext verwendet, der als URL interpretiert wird, so müssen Sie es urlencode wieder:

AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147') 

Und schließlich, da Sie diesen Text in HTML einbetten, müssen Sie es htmlescape:

AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&amp;sortmethod1=147') 

Deshalb sollten Sie am Ende mit:

<a href="javascript:AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&amp;sortmethod1=147')" title='Refresh'>Refresh</a> 

ich in der Regel diese Codierung Herausforderungen vermeiden indem Sie die Zeichenfolge M&S nicht direkt in das onclick-Ereignis oder den Anker setzen. In der Regel können Sie das Onclick-Ereignis und den Anker in der gleichen Art und Weise nicht codieren, da der Decodierprozess für beide ist anders:

onclick: html -> js -> url 
anchor: html -> url -> js -> url 

Aber warten Sie ... wenn Sie eine Hilfsfunktion so schreiben, es funktioniert:

function myQuery(q) { 
    var encodedQ = encodeURIComponent(q); // TODO: which character encoding is used here? 
    var url = 'http://10.0.0.195/program.exe?Qry147=' + encodedQ + '&sortmethod1=147'; 
    var response = AJAX_Get(url); 
    // TODO: handle errors 
} 

Jetzt können Sie schreiben:

<a href="javascript:myQuery('M&amp;S')">anchor</a> 
<a onclick="myQuery('M&amp;S')">event</a> 

Dieser Trick funktioniert, weil es keine % ist mehr im Anker Fall.

+0

Tolle Beschreibung - Ich denke ich verstehe, warum es jetzt nicht funktioniert. Es klingt, als wäre dies eine praktikable Lösung. Ich kann diesen Weg gehen, obwohl ich eine andere leicht hacky Lösung gefunden habe. – asc99c

1

Ich empfehle, den Parameter in seiner unverschlüsselten Form zu speichern und dann zu dem Zeitpunkt zu kodieren, zu dem er verwendet wird, sei es im Ereignis onClick oder im Anker.

0

Ich habe ein bisschen eine Lösung von einer anderen Stelle bekommen, aber es funktioniert ziemlich gut.

einfach ersetzen:

< a href = "javascript: AJAX_Get (...)" >

mit:

< a href = "javascript: void (0);" onClick = "AJAX_Get (...)" >

Die Aktion onClick funktioniert auf Ankern und anderen Elementen identisch. Offensichtlich haben alle Bits der Anwendung, die ihre eigenen HTML-Chunks geschrieben haben, immer noch ein Problem, aber es ist eine kleine Änderung, um diese Problemumgehung im Core-Code zu machen, also verwende ich diese Route vorerst.

EDIT: nur meine Antwort hier entdeckt, und erkannte, dass diese Lösung mehr Probleme als gelöst verursacht. Ich habe schließlich Zeit, um es richtig funktionieren zu ändern (so verwendet es die richtige Escaping-Methode zur richtigen Zeit.