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?
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
:
%
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).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:
/
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.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.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
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
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
.