wake-up-neo.com

Ein HTML-Bereich wird als% 2520 anstelle von% 20 angezeigt

Durch die Übergabe eines Dateinamens an den Firefox-Browser werden Leerzeichen durch %2520 Anstelle von %20 Ersetzt.

Ich habe den folgenden HTML-Code in einer Datei mit dem Namen myhtml.html:

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

Wenn ich myhtml.html In Firefox lade, wird das Bild als fehlerhaftes Bild angezeigt. Also habe ich mit der rechten Maustaste auf den Link geklickt, um das Bild anzuzeigen und es zeigt diese geänderte URL:

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

Was zum Teufel? Es hat meinen Space in einen %2520 Umgewandelt. Sollte es nicht in einen %20 Konvertiert werden?

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

99
Eric Leschinski

Ein bisschen erklären, was das %2520 Ist:

Das gemeinsame Leerzeichen wird, wie Sie selbst notiert haben, als %20 Codiert. Das Zeichen % Wird als %25 Codiert.

Die Art und Weise, wie Sie %2520 Erhalten, ist, wenn Ihre URL bereits einen %20 Enthält und erneut urlencodiert wird, wodurch der %20 In %2520 Umgewandelt wird.

Sind Sie (oder ein Framework, das Sie möglicherweise verwenden) Zeichen doppelt codiert?

Edit: Hier etwas erweitern, insbesondere für [~ # ~] lokale [~ # ~] Links. Angenommen, Sie möchten eine Verknüpfung zur Ressource C:\my path\my file.html Herstellen:

  • wenn Sie nur einen lokalen Dateipfad angeben, wird vom Browser erwartet, dass er alle angegebenen Zeichen verschlüsselt und schützt (oben sollten Sie Leerzeichen verwenden, da % ein gültiges Dateinamenzeichen ist und als solches wird verschlüsselt) bei der Konvertierung in eine richtige URL (siehe nächster Punkt).
  • wenn Sie eine URL mit dem Protokoll file:// angeben, geben Sie grundsätzlich an, dass Sie alle Vorsichtsmaßnahmen getroffen und die zu codierenden Elemente codiert haben. Der Rest sollte als Sonderzeichen behandelt werden. Im obigen Beispiel sollten Sie daher file:///c:/my%20path/my%20file.html Angeben. Abgesehen von der Korrektur von Schrägstrichen sollten Clients hier keine Zeichen codieren.

ANMERKUNGEN:

  • Schrägstrichrichtung - Schrägstriche / Werden in URLs und umgekehrte Schrägstriche \ In Windows-Pfaden verwendet. Die meisten Clients können jedoch mit beidem arbeiten, indem sie sie in den richtigen Schrägstrich umwandeln.
  • Darüber hinaus gibt es nach dem Protokollnamen drei Schrägstriche, da Sie sich stillschweigend auf den aktuellen Computer anstatt auf einen Remote-Host beziehen (der vollständige, nicht abgekürzte Pfad wäre file://localhost/c:/my%20path/my%file.html), Aber die meisten Clients funktionieren auch ohne den Host Teil (dh nur zwei Schrägstriche), indem Sie davon ausgehen, dass Sie die lokale Maschine meinen, und den dritten Schrägstrich hinzufügen.
199

Aus irgendeinem - möglicherweise gültigen - Grund wurde die URL zweimal codiert. %25 ist der urlencoded % Zeichen. Die ursprüngliche URL sah also so aus:

http://server.com/my path/

Dann wurde es einmal urlencodiert:

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

und zweimal:

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

Du solltest also keine Urlencodierung machen - in deinem Fall - da andere Komponenten dazu schon für dich scheinen. Nutze einfach ein Leerzeichen

10
hek2mgl

Wenn Sie versuchen, einen lokalen Dateinamen über den Firefox-Browser aufzurufen, müssen Sie das Protokoll file:\\\ ( http://en.wikipedia.org/wiki/File_URI_scheme ) oder Firefox erzwingen wird deinen Raum ZWEIMAL verschlüsseln. Ändern Sie das HTML-Snippet folgendermaßen:

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

dazu:

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

oder dieses:

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

Dann wird Firefox benachrichtigt, dass dies ein lokaler Dateiname ist, und das Bild wird im Browser korrekt gerendert, wobei die Zeichenfolge einmal korrekt codiert wird.

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

7
Eric Leschinski

Das folgende Code-Snippet hat mein Problem behoben. Dachte, dies könnte für andere nützlich sein.

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

Anstatt die Standardeinstellung encodeURIComponent zu verwenden, konvertiert meine erste Codezeile alle spaces in hyphens unter Verwendung des Regex-Musters /\s\g, Und die folgende Zeile macht genau das Gegenteil, dh konvertiert alles hyphens zurück zu spaces mit einem anderen regex pattern /-/g. Hier ist /g Tatsächlich für finding all Übereinstimmende Zeichen verantwortlich.

Wenn ich diesen Wert an meinen Ajax-Aufruf sende, wird er als normal spaces Oder einfach als %20 Übertragen und somit als double-encoding Entfernt.

0
Subrata Sarkar