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


109

Wenn Sie einen Dateinamen an den Firefox-Browser übergeben, werden Leerzeichen durch %2520 anstelle von ersetzt %20.

Ich habe den folgenden HTML-Code in einer Datei namens myhtml.html:

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

Wenn ich myhtml.htmlin Firefox lade , wird das Bild als fehlerhaftes Bild angezeigt. Also klicke ich mit der rechten Maustaste auf den Link, 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 verwandelte meinen Raum in einen %2520. Sollte es nicht sein, es in ein umzuwandeln %20?

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

Antworten:


219

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

Das Common Space-Zeichen wird so codiert, %20wie Sie es selbst notiert haben. Das %Zeichen ist codiert als %25.

Die Art und Weise, wie Sie erhalten, %2520ist, wenn Ihre URL bereits eine enthält %20und erneut urlencodiert wird, wodurch die %20zu transformiert wird %2520.

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

Bearbeiten: Dies etwas erweitern, insbesondere für lokale Links. Angenommen, Sie möchten eine Verknüpfung zur Ressource herstellen C:\my path\my file.html:

  • Wenn Sie nur einen lokalen Dateipfad angeben, wird vom Browser erwartet, dass er alle angegebenen %Zeichen beim Konvertieren codiert und schützt (oben sollten Sie Leerzeichen wie gezeigt angeben, da es sich um ein gültiges Dateinamenzeichen handelt und es als solches codiert wird) zu einer richtigen URL (siehe nächster Punkt).
  • Wenn Sie eine URL mit dem file://Protokoll angeben, geben Sie im Grunde 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 daher angeben file:///c:/my%20path/my%20file.html. Abgesehen von der Korrektur von Schrägstrichen sollten Clients hier keine Zeichen codieren.

ANMERKUNGEN:

  • Schrägstrichrichtung - Schrägstriche /werden in URLs und Schrägstriche \in Windows-Pfaden verwendet. Die meisten Clients arbeiten jedoch mit beiden, indem sie sie in den richtigen Schrägstrich konvertieren.
  • 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 auch hier funktionieren die meisten Clients ohne den Host-Teil (dh nur zwei Schrägstriche) ) mit der Annahme, dass Sie den lokalen Computer meinen und den dritten Schrägstrich hinzufügen.

1
Hexblot ist hier eigentlich richtig. Normalerweise geschieht dies, wenn Sie Ihre URLs durch Programmierung neu codieren und ein Bot hereinkommt und sie ein zweites Mal codiert. Bots haben die schlechte Angewohnheit, dies zu tun. Es gibt zwei Möglichkeiten, mit denen Sie dieses Problem lösen können. 1) Sie können entweder 404 oder 401 mit einer Try-Catch-Ausnahme ausführen oder eine kleine Funktion schreiben, die die doppelt decodierten Werte decodiert, bevor Sie sie an eine andere Methode für die Geschäftslogik übergeben.
Ryan Watts

Dies half mir herauszufinden, warum ich es beim Senden einer jQuery Ajax-Anfrage bekam. Ich habe das Datenattribut in einer Ajax-GET-Anforderung mit der Funktion encodeURIComponent für den Wert festgelegt, aber jQuery tut dies bereits standardmäßig, weshalb ich% 2520 erhalten habe. Wirklich hilfreich, danke.
Asher

Gibt es kein Befehlszeilenargument für Chrome, das angibt, ob der Link entweder interpretiert oder nicht interpretiert wird?
AleX_

Ich habe http://mysite/test & that... If I use UrlEncode, zu dem es sich ändert, http://mysite/test%20&%20thataber ich möchte auch, dass der &zu% 26 geändert wird, also ist es mysite / test% 20% 26% 20that `Wie kann ich das tun?
Si8

10

Aus irgendeinem - möglicherweise gültigen - Grund wurde die URL zweimal codiert. %25ist das urlencodierte %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/

Sie sollten also - in Ihrem Fall - keine Urlencodierung durchführen, da andere Komponenten dies bereits für Sie zu tun scheinen . Verwenden Sie einfach ein Leerzeichen


Ich habe das gleiche Problem, aber ich verstehe nicht, warum die Standard-Urlencodierung beim ersten Mal zweimal verarbeitet wurde.
Jungwon Jin

Abhängig von der Situation kann die Doppelkodierung ein vollkommen gültiges Ergebnis der korrekten Verwendung der Kodierung sein. Diese Antwort kann den Eindruck erwecken, dass die Doppelcodierung immer falsch ist und dass Sie Codierungsprobleme einfach beheben können, indem Sie so viele Codierungs- / Entschlüsselungsaufrufe wie nötig hinzufügen, damit "es funktioniert". Dies ist falsch, und so entstehen in erster Linie Codierungsfehler. -1
Florian Winter

@FlorianWinter Ich sehe nicht wirklich, wo Sie dies zwischen den Zeilen lesen. Kannst du mir helfen? (Bitte lesen Sie die Frage und meine Antwort)
hek2mgl

7

Wenn Sie versuchen, einen lokalen Dateinamen über den Firefox-Browser aufzurufen, müssen Sie das file:\\\Protokoll erzwingen ( http://en.wikipedia.org/wiki/File_URI_scheme ). Andernfalls codiert Firefox Ihren Speicherplatz ZWEIMAL. Ändern Sie das HTML-Snippet von diesem:

<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 es rendert das Bild korrekt im Browser, wobei die Zeichenfolge einmal korrekt codiert wird.

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


0

Das folgende Codefragment 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 encodeURIComponentzu verwenden, konvertiert meine erste Codezeile alles spacesin ein hyphensRegex-Muster /\s\gund die folgende Zeile macht einfach das Gegenteil, dh sie konvertiert alles hyphenszurück in spaceseine andere regex pattern /-/g. Hier /gist eigentlich für die finding allÜbereinstimmung der Zeichen verantwortlich.

Wenn ich diesen Wert an meinen Ajax-Aufruf sende, wird er als normal spacesoder einfach durchlaufen %20und somit entfernt double-encoding.


1
Ich gehe davon aus, dass Sie die Angelegenheit nicht lösen, sondern nur vertuschen - die Grundursache ist, dass sie immer noch irgendwo da ist und Sie doppelte Arbeit leisten (irgendwo, wo Sie versehentlich zweimal codieren, und an einem anderen Ort, den Sie manuell dekodieren, um sie zu behandeln es auf). Angenommen, Sie möchten die Dinge "richtig" machen, ist es am besten, zu debuggen und den wahren Schuldigen zu finden.
Nick Andriopoulos

Eigentlich hat die Lösung für mich überall dort funktioniert, wo ich dieses Problem hatte. Also habe ich gepostet.
Subrata Sarkar

2
@NiladriSarkar Hexbolt versuchte zu sagen, dass Ihr Code zwar funktioniert, aber keine praktikable Lösung ist, sondern eine schmutzige Lösung, die vermieden werden sollte ...
2Dee

-1

Versuche dies?

encodeURIComponent('space word').replace(/%20/g,'+')


1
Willkommen bei StackOverflow! Im Allgemeinen sind Antworten nützlicher, wenn sie eine Erklärung enthalten, warum Ihr Vorschlag das Problem des OP löst, und nicht nur ein Codefragment. Da diese Frage bereits eine akzeptierte Antwort hat, ist es eine gute Idee, eine Erklärung hinzuzufügen, warum Ihre Antwort korrekter ist als diese.
DaveyDaveDave
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.