Un espace html affiche %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 HTML suivant dans un fichier appelé myhtml.html :

<img src="C:Documents and SettingsscreenshotsImage01.png"/>

quand je charge myhtml.html dans firefox, l'image apparaît comme une image cassée. Donc je clique droit sur le lien pour voir l'image et il montre cette URL modifiée:

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

qu'est-ce qui se passe? Il converti mon espace dans un %2520 . Ne devrait-il pas le convertir en %20 ?

Comment changer ce fichier HTML pour que le navigateur puisse trouver mon image? Ce qui se passe ici?

89
demandé sur Toby Allen 2013-04-18 17:55:30

5 réponses

un peu d'explication quant à ce que %2520 est:

le caractère de l'espace commun est codé comme %20 comme vous l'avez noté vous-même. 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 obtient urlencoded à nouveau, qui transforme le %20 en %2520 .

Êtes-vous (ou n'importe quel cadre vous pourriez être utiliser) des caractères de codage doubles?

Edit: Étendre un peu sur ce, en particulier pour LOCAL liens. Présumant que vous voulez créer un lien vers la ressource C:\my path\my file.html :

  • si vous fournissez un chemin de fichier local seulement, le navigateur est censé encoder et protéger tous les caractères donnés (dans le ci-dessus, vous devriez le donner avec des espaces comme indiqué, puisque % est un caractère de nom de fichier valide et comme ainsi, il sera encodé) lors de la conversion à une URL appropriée (voir point suivant).
  • si vous fournissez une URL avec le protocole file:// , vous déclarez essentiellement que vous avez pris toutes les précautions et encodé ce qui doit être encodé, 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 . Mis à part la correction des slashes, les clients ne devraient pas encoder les caractères ici.

NOTES:

  • Slash direction - forward slashes / sont utilisés dans les URLs, slashes inversés \ dans les chemins Windows, mais la plupart des clients vont travailler avec les deux en les convertissant à la slash forward appropriée.
  • de plus, il y a 3 slashs après le nom du protocole, puisque vous faites référence silencieusement à la machine actuelle au lieu d'un hôte distant ( le chemin complet sans abréviation 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 slashes seulement) en supposant que vous voulez dire la machine locale et en ajoutant la troisième slash.
173
répondu Nick Andriopoulos 2017-03-17 13:34:00

quelle que soit la raison pour laquelle l'url a été encodée deux fois. %25 est le signe urlencodé % . Ainsi, l'url originale ressemblait à:

http://server.com/my path/

puis il a obtenu urlencoded une fois:

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

et deux fois:

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

Donc vous devriez faire aucun encodage que d'autres composants semble déjà pour vous. Utiliser simplement un espace

9
répondu hek2mgl 2013-04-18 14:04:24

quand vous essayez de visiter un nom de fichier local par le navigateur firefox, vous devez forcer le protocole file:\\ ( http://en.wikipedia.org/wiki/File_URI_scheme ) ou alors firefox encodera votre espace deux fois. Changez le fragment html de ceci:

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

à ceci:

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

ou ceci:

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

puis firefox est notifié qu'il s'agit d'un nom de fichier local, et il rend l'image correctement dans le navigateur, encodant correctement la chaîne une fois.

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

7
répondu Eric Leschinski 2013-04-18 14:33:23

l'extrait de code suivant a résolu mon problème. Pensé que cela pourrait être utile à d'autres.

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

plutôt en utilisant par défaut encodeURIComponent ma première ligne de code est de convertir tous spaces en hyphens en utilisant le motif regex /\s\g et la ligne suivante fait juste l'inverse, c.-à-d. convertit tous hyphens retour à spaces en utilisant un autre regex pattern /-/g . Ici /g est en fait responsable finding all corresponding characters.

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

0
répondu Subrata Sarkar 2015-10-01 07:28:31

essayez ça?

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

-1
répondu Hopefulee 2018-05-10 05:15:54