Un espacio html se muestra como% 2520 en lugar de% 20

109

Pasar un nombre de archivo al navegador Firefox hace que reemplace espacios con en %2520 lugar de %20.

Tengo el siguiente HTML en un archivo llamado myhtml.html:

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

Cuando cargo myhtml.htmlen Firefox, la imagen aparece como una imagen rota. Así que hago clic derecho en el enlace para ver la imagen y muestra esta URL modificada:

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

¿Que demonios? Convirtió mi espacio en un %2520. ¿No debería convertirlo en un %20?

¿Cómo cambio este archivo HTML para que el navegador pueda encontrar mi imagen? ¿Que está pasando aqui?

Eric Leschinski
fuente

Respuestas:

219

Un poco de explicación de qué %2520es eso :

El carácter de espacio común está codificado %20como usted mismo señaló. El %carácter está codificado como %25.

La forma de obtenerlo %2520es cuando su URL ya tiene un %20código de url y se vuelve a codificar, lo que transforma el %20a %2520.

¿Está usted (o algún marco que pueda estar usando) caracteres de doble codificación?

Editar: Ampliando un poco esto, especialmente para los enlaces LOCALES . Suponiendo que desea vincular al recurso C:\my path\my file.html:

  • si solo proporciona una ruta de archivo local, se espera que el navegador codifique y proteja todos los caracteres dados (en lo anterior, debe proporcionarlos con espacios como se muestra, ya que % es un carácter de nombre de archivo válido y, como tal, se codificará) al convertir a una URL adecuada (consulte el siguiente punto).
  • si proporciona una URL con el file://protocolo, básicamente está indicando que ha tomado todas las precauciones y codificado lo que necesita codificación, el resto debe tratarse como caracteres especiales. En el ejemplo anterior, debería proporcionar file:///c:/my%20path/my%20file.html. Aparte de corregir las barras, los clientes no deben codificar caracteres aquí.

NOTAS:

  • Dirección de la barra inclinada : las barras diagonales /se utilizan en las URL, las barras diagonales inversas \en las rutas de Windows, pero la mayoría de los clientes trabajarán con ambas convirtiéndolas en la barra inclinada correcta.
  • Además, hay 3 barras después del nombre del protocolo, ya que se está refiriendo silenciosamente a la máquina actual en lugar de a un host remoto (la ruta completa sin abreviar sería file://localhost/c:/my%20path/my%file.html), pero nuevamente la mayoría de los clientes trabajarán sin la parte del host (es decir, solo dos barras ) asumiendo que se refiere a la máquina local y agregando la tercera barra.
Nick Andriopoulos
fuente
1
Hexblot es realmente correcto aquí. Por lo general, esto sucede cuando usted está codificando sus URL mediante programación y un bot entra y lo codifica por segunda vez. Los bots tienen la mala costumbre de hacer esto. Hay dos en los que puede manejar este problema. 1) Puede 404 o 401 con una excepción try catch o puede escribir una pequeña función que decodificará los valores decodificados dobles antes de pasarlos a otro método de lógica empresarial.
Ryan Watts
Esto me ayudó a descubrir por qué lo recibía al enviar una solicitud de jQuery ajax. Estaba configurando el atributo de datos en una solicitud GET de ajax con la función encodeURIComponent en el valor, pero jQuery ya lo hace de forma predeterminada, por lo que obtenía% 2520. Gracias de gran ayuda.
Asher
¿No hay un argumento de línea de comando para que Chrome le diga que interprete o no interprete el enlace?
AleX_
Tengo http://mysite/test & that... If I use UrlEncode` a la que cambia, http://mysite/test%20&%20thatpero también quiero &que cambie a% 26, así que es mysite / test% 20% 26% 20that `¿Cómo puedo hacer eso?
Si8
10

Por alguna razón, posiblemente válida, la URL se codificó dos veces. %25es el %signo codificado por urlencoded . Entonces, la URL original se veía así:

http://server.com/my path/

Luego se codificó en urlen una vez:

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

y dos veces:

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

Por lo tanto, no debe realizar codificación urlen, en su caso , ya que otros componentes parecen hacerlo para usted. Usa simplemente un espacio

hek2mgl
fuente
Tengo el mismo problema, pero no entiendo por qué la codificación de URL predeterminada se procesó dos veces la primera vez.
jungwon jin
Dependiendo de la situación, la codificación doble puede ser un resultado perfectamente válido de usar la codificación correctamente. Esta respuesta puede crear la impresión de que la codificación doble siempre es incorrecta y que simplemente puede solucionar los problemas de codificación agregando tantas llamadas de codificación / descodificación como sea necesario para "que funcione". Esto está mal, y así es como surgen los errores de codificación en primer lugar. -1
Florian Winter
@FlorianWinter Realmente no veo dónde se lee esto entre líneas. ¿Me puedes ayudar? (Lea la pregunta y mi respuesta)
hek2mgl
7

Cuando intentas visitar un nombre de archivo local a través del navegador Firefox, debes forzar el file:\\\protocolo ( http://en.wikipedia.org/wiki/File_URI_scheme ) o, de lo contrario, Firefox codificará tu espacio DOS VECES. Cambie el fragmento html de esto:

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

a esto:

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

o esto:

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

Luego, se notifica a Firefox que este es un nombre de archivo local y muestra la imagen correctamente en el navegador, codificando correctamente la cadena una vez.

Enlace útil: http://support.mozilla.org/en-US/questions/900466

Eric Leschinski
fuente
0

El siguiente fragmento de código resolvió mi problema. Pensé que esto podría ser útil para otros.

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

En lugar de usar el predeterminado, encodeURIComponentmi primera línea de código es convertir todo spacesen el hyphensuso de un patrón de expresiones regulares /\s\gy la siguiente línea simplemente hace lo contrario, es decir, convierte todo de hyphensnuevo para spacesusar otro regex pattern /-/g. Aquí /ges realmente responsable de hacer finding allcoincidir los personajes.

Cuando envío este valor a mi llamada Ajax, atraviesa como normal spaceso simplemente %20y, por lo tanto, se deshace de double-encoding.

Subrata Sarkar
fuente
1
Supongo que porque no está resolviendo el problema, solo lo está encubriendo, la raíz lo causa todavía en algún lugar allí, y está haciendo un doble trabajo (en algún lugar está codificando accidentalmente dos veces, y en otro lugar está decodificando manualmente para cubrir arriba). Suponiendo que quiera hacer las cosas "correctamente", lo mejor sería depurar y encontrar al verdadero culpable.
Nick Andriopoulos
En realidad, la solución funcionó para mí donde sea que tenga este problema. Así que publiqué.
Subrata Sarkar
2
@NiladriSarkar lo que hexbolt estaba tratando de decir es que, si bien su código funciona, no es una solución viable, más bien una solución sucia, y debe evitarse ...
2Dee
-1

¿Prueba esto?

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

Hopefulee
fuente
1
¡Bienvenido a StackOverflow! Generalmente, las respuestas son más útiles si incluyen alguna explicación sobre por qué su sugerencia resolverá el problema del OP, en lugar de solo un fragmento de código. Además, como esta pregunta ya tiene una respuesta aceptada, sería una buena idea agregar alguna explicación de por qué su respuesta es más correcta que esa.
DaveyDaveDave