2013-04-18 19 views
81

Durch die Übergabe eines Dateinamens an den Firefox-Browser werden Leerzeichen durch %2520 anstelle von ersetzt.Ein HTML-Speicherplatz wird als% 2520 anstelle von% 20 angezeigt.

Ich habe folgende HTML in einer Datei myhtml.html genannt:

<img src="C:\Documents and Settings\screenshots\Image01.png"/> 

Wenn ich myhtml.html in Firefox laden, das Bild zeigt, wie ein gebrochenes Bild nach oben. Also klicke ich mit der rechten Maustaste auf den Link um das Bild zu sehen und es zeigt diese modifizierte URL an:

file:///c:/Documents%2520and%2520Settings/screenshots/Image01.png 
        ^
        ^-----Firefox changed my space to %2520. 

Was zum Teufel? Es hat meinen Raum in eine %2520 umgewandelt. Sollte es nicht zu einem konvertieren?

Wie ändere ich diese HTML-Datei, damit der Browser mein Bild finden kann? Was ist denn hier los?

Antwort

158

Ein bisschen zu erklären, was die %2520 ist:

Der gemeinsame Raum Charakter als %20 codiert ist, wie Sie selbst bemerkt. Das % Zeichen ist als %25 codiert.

Die Art und Weise Sie %2520 erhalten ist, wenn Ihre URL bereits eine %20 in ihm hat, und wird wieder Urlencoded, was die %20-%2520 verwandelt.

Sind Sie (oder ein anderes Framework, das Sie verwenden) doppelt codierte Zeichen?

Edit: Erweiterung ein wenig auf diese, vor allem für LOCAL Links. Vorausgesetzt, dass Sie auf die Ressource verknüpfen C:\my path\my file.html: nur

  • , wenn Sie einen lokalen Dateipfad zur Verfügung stellen, wird der Browser gegeben alle Zeichen zu kodieren und zu schützen erwartet (in den oben genannten, sollten Sie es mit Leerzeichen geben, wie gezeigt, da % ein gültiger Dateiname ist und als solcher codiert wird, wenn in eine korrekte URL konvertiert wird (siehe nächster Punkt).
  • Wenn Sie eine URL mit dem file:// Protokoll angeben, geben Sie im Wesentlichen an, dass Sie alle Vorsichtsmaßnahmen getroffen und codiert haben, was codiert werden muss, der Rest sollte als Sonderzeichen behandelt werden. Im obigen Beispiel sollten Sie also file:///c:/my%20path/my%20file.html angeben. Abgesehen von Schrägstrichen sollten Clients hier keine Zeichen codieren.

NOTES:

  • Slash Richtung - vorwärts Schrägstriche / werden in URLs verwendet, Schrägstriche Reverse \ in Windows-Pfade, aber die meisten Kunden mit beiden arbeiten, indem sie auf die richtige Schrägstrich umgewandelt wird.
  • Zusätzlich gibt es 3 Schrägstriche nach dem Protokollnamen, da Sie sich stillschweigend auf den aktuellen Rechner statt auf einen entfernten Host beziehen (der vollständige ungekürzte Pfad wäre file://localhost/c:/my%20path/my%file.html), aber die meisten Clients arbeiten auch ohne den Host-Teil (dh nur zwei Schrägstriche), indem Sie annehmen, dass Sie die lokale Maschine meinen und den dritten Schrägstrich hinzufügen.
+1

Hexblot ist eigentlich richtig hier. Normalerweise passiert dies, wenn Sie Ihre URLs per Programmierung neu codieren, und ein Bot kommt herein und codiert es ein zweites Mal. Bots haben eine schlechte Angewohnheit, dies zu tun. Es gibt zwei Möglichkeiten, wie Sie mit diesem Problem umgehen können. 1) Sie können entweder 404 oder 401 mit einer try catch-Ausnahme verwenden oder Sie können eine kleine Funktion schreiben, die die doppelt dekodierten Werte decodiert, bevor Sie sie an eine andere Methode für Geschäftslogik übergeben. –

+0

Dies half mir herauszufinden, warum ich es bekommen habe, wenn ich eine jQuery Ajax Anfrage gesendet habe. Ich habe das Datenattribut in einer Ajax-GET-Anfrage mit der encodeURIComponent-Funktion für den Wert gesetzt, aber jQuery tut dies bereits standardmäßig, weshalb ich% 2520 erhielt. Wirklich hilfreich, danke. – Asher

+0

Gibt es kein Befehlszeilenargument für chrome, um es entweder zu interpretieren oder die Verknüpfung nicht zu interpretieren? –

7

Wenn Sie versuchen, einen lokalen Dateinamen durch Firefox-Browser zu besuchen, müssen Sie das file:\\\ Protokoll erzwingen (http://en.wikipedia.org/wiki/File_URI_scheme) oder sonst firefox Ihren Raum ZWEIMAL kodieren. Ändern Sie den HTML-Schnipsel aus dieser:

<img src="C:\Documents and Settings\screenshots\Image01.png"/> 

dazu:

<img src="file:\\\C:\Documents and Settings\screenshots\Image01.png"/> 

oder dies:

<img src="file://C:\Documents and Settings\screenshots\Image01.png"/> 

Dann wird firefox darüber informiert, dass dies ein lokaler Dateiname ist, und es macht das Bild korrekt im Browser, einmal korrekt die Zeichenfolge zu codieren.

Hilfreiche Link: http://support.mozilla.org/en-US/questions/900466

8

Aus welchem ​​Grund die URL zweimal codiert wurde. %25 ist das urlencodierte % Zeichen. So sah die ursprüngliche URL wie:

http://server.com/my path/ 

Dann einmal wurde es Urlencoded:

http://server.com/my%20path/ 

und zweimal:

http://server.com/my%2520path/ 

Sie sollten also kein urlencoding tun als andere Komponenten scheinen, dass schon für dich. Verwenden Sie einfach einen Raum

+0

Ich habe das gleiche Problem, aber ich verstehe nicht, warum Standard-Urlencoding wurde zweimal zum ersten Mal verarbeitet. – jwjin

-1

Das folgende Code-Snippet löste mein Problem. Dachte, das könnte für andere nützlich sein.

var strEnc = this.$.txtSearch.value.replace(/\s/g, "-"); 
 
strEnc = strEnc.replace(/-/g, " ");

Rather Standard encodeURIComponent meine erste Zeile des Codes verwendet, wird die Umwandlung aller spaces in hyphens RegexMuster mit /\s\g und die folgende Zeile nur macht genau das Gegenteil, dh wandelt alle hyphens zurück in spaces eine andere Verwendung regex pattern /-/g. Hier ist /g eigentlich verantwortlich für finding all passende Zeichen.

Als ich diesen Wert auf meinen Ajax-Aufruf sandte, durchläuft es als normal spaces oder einfach %20 und somit wird die double-encoding befreien.

+0

Warum runter?! –

+1

Ich nehme an, weil Sie die Angelegenheit nicht lösen, es nur vertuschen - die Ursache dafür, dass es immer noch irgendwo da ist, und Sie machen doppelte Arbeit (irgendwo, wo Sie versehentlich zweimal codieren und woanders Sie manuell dekodieren) vertuschen Sie es). Angenommen, Sie wollen Dinge "richtig" tun, wäre das beste Ding zu debuggen und den wahren Schuldigen zu finden. – hexblot

+0

Eigentlich funktionierte die Lösung für mich, wo immer ich dieses Problem hatte. Also habe ich gepostet. –

Verwandte Themen