¿Cómo mostrar un nombre de archivo que no sea ASCII en el cuadro de descarga de archivos en los navegadores?

StackOverflow https://stackoverflow.com/questions/149058

  •  02-07-2019
  •  | 
  •  

Pregunta

No parece haber una forma aceptada de enviar un parámetro de encabezado en formato no ascii.

El encabezado para la descarga de archivos generalmente se ve como

Disposición del contenido: adjunto; filename = " theasciifilename.doc "

Excepto si rompes una cadena codificada en utf8 en el parámetro de nombre de archivo, Firefox lo manejará bien, mientras que IE lanzará.

Hay un documento en CodeProject que explica un método para codificar el nombre de archivo.

Este documento codifica B?n Ki?m Kê.doc a B% e1% ba% a3n% 20Ki% e1% bb% 83m% 20K% c3% aa.doc por codificación hexadecimal de los bytes.

Problema # 1: el primer carácter en esa cadena: ? tiene un valor de ?: codifique ese número en Hex y obtendrá% a3% 1e. ¿Cómo este tipo consiguió% e1% ba% a3? (Obviamente me estoy perdiendo algo simple aquí)

Problema # 2: ¡Mientras que IE reconoce esta codificación, Firefox no! ¿Qué hacer?

¿Fue útil?

Solución

Respuesta a la pregunta # 1: Confundes Unicode y UTF-8. El valor hexadecimal de '?' es 0xA31E, sin embargo, no es un carácter UTF-8. En UTF-8 ese carácter requiere tres bytes, 0xE1 0xBA 0xA3 . La codificación de la URL está mal definida para las codificaciones que no son ascii, pero% e1% ba% a3 es la codificación UTF-8 válida para usar para ese carácter.

Otros consejos

Las especificaciones básicamente no permiten nada más que US-ASCII. Los encabezados HTTP son US-ASCII. La carga útil de HTTP tiene como valor predeterminado ISO 8859-1, pero se refiere al cuerpo del contenido, no a los encabezados.

Podría decirse que lo correcto sería utilizar la técnica MIME para codificar datos no ASCII en encabezados, como se describe en RFC 2047 , pero no tengo idea de si los navegadores realmente lo admiten.

EDITAR: Vaya, no, la sección 5 de RFC 2047 dice explícitamente que la forma codificada no está permitida en la Disposición de contenido. Parece que estás fuera de suerte, no hay ningún estándar.

EDIT 2: Hay un estándar: RFC 2231 define cómo se supone que ahora esto funciona. Es compatible con algunos navegadores, pero no es compatible con IE. Encontré algunos casos de prueba que demuestran cómo funciona y qué es el soporte del navegador disponible.

Para el problema n. ° 2, debe codificar en URL el nombre del archivo para Internet Explorer y Firefox. La única diferencia es que necesitas usar el formato de RFC 2231 en Firefox. Esto se aplica a Firefox 3 e Internet Explorer 7.

En el enlace que tienes arriba, e1 ba a3 es la codificación UTF-8 del carácter mencionado, no el código del carácter.

Respuesta (más o menos) al problema # 2:

Desde que descubrió que el esquema de nombres en un navegador no funciona en el otro, su única solución es hacerlo de manera diferente para cada navegador, similar al ejemplo here .

En caso de que el enlace desaparezca, la solución es básicamente:

1. If browser is IE URL encode filename
2. Generate Content-disposition header

Por supuesto, determinar si el navegador es IE por User-agent (que es la única forma en que puede hacerlo) está cargado de todo tipo de riesgos habituales.

Como suena central en América del Norte, si es importante que esto funcione en una gran cantidad de navegadores que no controla, lo que puede tener bloqueado o modificado el agente de usuario, simplemente evite los caracteres codificados en UTF-8 en el nombre de archivo y siempre use " Descargar " o algo así.

Lamentablemente, actualmente no existe una forma única que funcione en todos los Agentes de usuario.

Consulte http://greenbytes.de/tech/tc2231/ para los casos de prueba, luego quejarse a Microsoft, Google y Apple.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top