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?
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 fournirfile:///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.
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
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
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
.
essayez ça?
encodeURIComponent('space word').replace(/%20/g,'+')