web-dev-qa-db-fra.com

Un espace html indique% 2520 au lieu de% 20

En passant un nom de fichier au navigateur firefox, il remplace les espaces par %2520 Au lieu de %20.

J'ai le code HTML suivant dans un fichier appelé myhtml.html:

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

Lorsque je charge myhtml.html Dans Firefox, l'image apparaît sous la forme d'une image endommagée. J'ai donc fait un clic droit sur le lien pour voir l'image et cela montre cette URL modifiée:

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

Que diable? Il a converti mon espace en un %2520. Ne devrait-il pas être converti en %20?

Comment modifier ce fichier HTML afin que le navigateur puisse trouver mon image? Que se passe-t-il ici?

99
Eric Leschinski

Un peu d'explication sur ce que cela %2520 est :

Le caractère d’espace commun est codé comme suit: %20 comme vous l'avez noté vous-même. Le % Le caractère est codé comme %25.

La façon dont vous obtenez %2520 est quand votre URL a déjà un %20 dedans, et se retrouve à nouveau encodé, ce qui transforme le %20 à %2520.

Utilisez-vous (ou tout framework que vous pourriez utiliser) des caractères à double codage?

Edit: Développer un peu là-dessus, en particulier pour les liens [~ # ~] [~ # ~] locaux . En supposant que vous souhaitiez créer un lien vers la ressource C:\my path\my file.html:

  • si vous fournissez uniquement un chemin de fichier local, le navigateur doit coder et protéger tous les caractères indiqués (dans ce qui précède, vous devez le spécifier avec les espaces indiqués, car % est un caractère de nom de fichier valide et, en tant que tel, il sera codé) lors de la conversion en une URL correcte (voir point suivant).
  • si vous fournissez une URL avec le file:// protocole, vous indiquez en fait que vous avez pris toutes les précautions et codé ce qui doit être codé, le reste doit être traité comme des caractères spéciaux. Dans l'exemple ci-dessus, vous devez donc fournir file:///c:/my%20path/my%20file.html. En plus de la correction des barres obliques, les clients ne doivent pas encoder de caractères ici.

REMARQUES:

  • Direction de la barre oblique - barres obliques en avant / sont utilisés dans les URL, les barres obliques inversées \ dans les chemins Windows, mais la plupart des clients fonctionnent avec les deux en les convertissant en une barre oblique appropriée.
  • De plus, il y a 3 barres obliques après le nom du protocole, car vous vous référez en silence à la machine actuelle au lieu d'un hôte distant (le chemin complet non abrégé serait file://localhost/c:/my%20path/my%file.html), mais encore une fois, la plupart des clients travailleront sans la partie hôte (c'est-à-dire deux barres obliques uniquement) en supposant que vous entendez la machine locale et en ajoutant la troisième barre oblique.
199
Nick Andriopoulos

Pour une raison quelconque - éventuellement valide -, l'URL a été codée deux fois. %25 est l'urlencodé % signe. Ainsi, l'URL d'origine ressemblait à:

http://server.com/my path/

Ensuite, il a été encodé une fois:

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

et deux fois:

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

Donc, vous ne devriez pas faire de code url - dans votre cas - comme d’autres composants semblent le faire déjà pour vous. Utilisez simplement un espace

10
hek2mgl

Lorsque vous essayez de visiter un nom de fichier local via le navigateur Firefox, vous devez forcer le file:\\\ protocole ( http://en.wikipedia.org/wiki/File_URI_scheme ) ou bien firefox encodera votre espace DEUX FOIS. Changez l'extrait de code HTML à partir de ceci:

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

pour ça:

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

ou ca:

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

Ensuite, firefox est averti qu'il s'agit d'un nom de fichier local et restitue l'image correctement dans le navigateur en codant correctement la chaîne une fois.

Lien utile: http://support.mozilla.org/en-US/questions/900466

7
Eric Leschinski

L'extrait de code suivant a résolu mon problème. Je pensais que cela pourrait être utile aux autres.

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

En utilisant plutôt la valeur par défaut encodeURIComponent ma première ligne de code convertit tous les spaces en hyphens en utilisant un motif regex /\s\g et la ligne suivante ne fait que l’inverse, c’est-à-dire qu'il convertit tous les hyphens en spaces en utilisant un autre regex pattern /-/g. Ici /g est en fait responsable de finding all caractères correspondants.

Lorsque j'envoie cette valeur à mon appel Ajax, elle se transforme en normal spaces ou simplement %20 et se débarrasse ainsi de double-encoding.

0
Subrata Sarkar