una tener metadescription maximos longitud disposition description descripcion debe cuantos content caracteres c++ browser http-headers cgi content-disposition

c++ - tener - Caracteres especiales en el nombre del archivo Content-Disposition



cuantos caracteres debe tener una meta description (1)

Firefox, MSIE (comenzando con la versión 9), soporte de Opera, Konq y Chrome; MSIE8 y Safari no son compatibles; el resto es desconocido, la codificación definida en RFC 5987.

Tenga en cuenta que en

Content-Disposition: attachment; filename*=UTF-8''''weird%20%23%20%80%20%3D%20%7B%20%7D%20%3B%20filename.txt

tienes la codificación del carácter Euro equivocada; su punto de código Unicode no es% 80, arreglar esto debería hacerlo funcionar en todas partes, excepto en Safari (la codificación correcta es% e2% 82% ac).

Caso de prueba en:

http://greenbytes.de/tech/tc2231/#attwithfn2231utf8

Este hilo es un duplicado de Cómo codificar el parámetro de nombre de archivo del encabezado Content-Disposition en HTTP? Pero dado que esta pregunta fue hecha hace mucho tiempo y todavía no hay una respuesta satisfactoria (en mi opinión), me gustaría preguntar nuevamente.

Desarrollo una aplicación C ++ CGI que entrega archivos que pueden contener caracteres especiales en sus nombres, como
" raro # € = {}; filename.txt "

Parece que no hay posibilidad de configurar el contenido HTTP-Disposición de forma que funcione para todos los navegadores como

  • explorador de Internet
  • Firefox
  • Cromo
  • Ópera
  • Safari

Estaría contento con una solución diferente para cada navegador.
Ahora que es lo lejos que vine:

Internet Explorer (se agregaron comillas dobles y se reemplazaron # y;)

Content-Disposition: attachment; filename="weird %23 € = { } %3B filename.txt"

Firefox (las comillas dobles parecen funcionar, nada más que hacer):

Content-Disposition: attachment; filename="weird # € = { } ; filename.txt"

Otra alternativa de trabajo:

Content-Disposition: attachment; filename*=UTF-8''''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt

Cromo

cuando se usan solo comillas dobles surgen estos problemas:

  • = desaparece en nombres de archivo
  • € será reemplazado por -

pero esto funciona:

Content-Disposition: attachment; filename*=UTF-8''''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt

Ópera

El uso de comillas dobles o el uso de la sintaxis: nombre de archivo * = UTF-8 '''' ... produce los siguientes problemas:

  • Múltiples espacios unidos en los nombres de archivo se reducen a uno
  • {y} disapear: " ab {} cd.txt " -> " abcd.txt "
  • los nombres de archivo se cortan después; en él: " abc; def.txt " -> " abc "

EDIT 2: Esto se debió a las limitaciones de longitud del nombre de archivo. Esta sintaxis funciona con Opera:

Content-Disposition: attachment; filename*=UTF-8''''weird%20%23%20%e2%82%ac%20%3D%20%7B%20%7D%20%3B%20filename.txt

Safari

  • € será reemplazado por un carácter invisible (usando comillas dobles)

    no solution that prevents that little problem

La sugerencia del otro hilo (mencionado anteriormente) usando

Content-Disposition: attachment; filename*=UTF-8''''weird%20%23%20%80%20%3D%20%7B%20%7D%20%3B%20filename.txt

no funcionó para mí Los caracteres de escape no se volverán a traducir o el navegador quiere guardarlos en el archivo con el nombre de mi aplicación cgi. Eso fue porque mi codificación era incorrecta. No codifiqué de acuerdo con RFC 5987. Pero Safari no usa esta codificación de todos modos. Así que no hay solución para el personaje de € hasta el momento.

BTW: Un convertidor UTF-8 http://www.rishida.net/tools/conversion/

Usé la última versión de cada navegador para estas pruebas:

  • Firefox 7
  • Internet Explorer 9
  • Chrome 15
  • Opera 11.5
  • Safari 5.1

PD: Probé todos los caracteres especiales en mi teclado. Solo utilicé en este hilo los que causaron problemas.

EDITAR:

También probé un nombre de archivo con todos los caracteres especiales en mi teclado (que son posibles en un nombre de archivo) y que no funcionó como lo hizo con la cadena de prueba anterior:

Cadena de prueba completa:

0 ! § $ % & ( ) = ` ´ { } [ ] ² ³ @ € µ ^ ° ~ + '' # - _ . , ; ü ä ö ß 9.jpg

Cadena de prueba codificada:

0%20%21%20%C2%A7%20%24%20%25%20%26%20%28%20%29%20%3D%20%60%20%C2%B4%20%7B%20%7D%20%20%20%20%5B%20%5D%20%C2%B2%20%C2%B3%20%40%20%E2%82%AC%20%C2%B5%20%5E%20%C2%B0%20~%20%2B%20%27%20%23%20-%20_%20.%20%2C%20%3B%20%C3%BC%20%C3%A4%20%C3%B6%20%C3%9F%209.jpg

Usando este método:

Content-Disposition: attachment; filename*=UTF-8''''0%20%21%20%C2%A7%20%24%20%25%20%26%20%28%20%29%20%3D%20%60%20%C2%B4%20%7B%20%7D%20%20%20%20%5B%20%5D%20%C2%B2%20%C2%B3%20%40%20%E2%82%AC%20%C2%B5%20%5E%20%C2%B0%20~%20%2B%20%27%20%23%20-%20_%20.%20%2C%20%3B%20%C3%BC%20%C3%A4%20%C3%B6%20%C3%9F%209.jpg

Tuve los siguientes resultados:

  • Firefox funciona
  • Chrome funciona
  • IE: $% y () = `''{} [] ² ³ @ € μ ^ ° ~ +'' # - _. ,; ü ä ß 9.jpg (eliminado los primeros 6 caracteres). EDIT 2: Esto se debió a las limitaciones de longitud del nombre de archivo del navegador. Comienza a cortar el nombre del archivo desde el comienzo de la cadena. No profundicé en esto, pero parece que los nombres de archivo normales pueden tener aproximadamente 200 caracteres de largo y nombres de archivo con muchas secuencias de escape aún más, pero menos de 250. Pero eso está bien.
  • Opera: 0! § $% & () = `''[] ² ³ @ € μ ^ ° ~ +'' # - _. ,; ü ä ß 9.jpg (faltan algunos personajes como antes). EDIT 2: acorté mi cadena de prueba porque sospechaba "problemas" de longitud de nombre de archivo con Opera, como ocurre con IE, y funcionó allí también.
  • Safari no funciona con esa sintaxis. Eso fue exceptuado.

EDICION 2:

El estado hasta ahora es que el nombre de archivo de sintaxis * = UTF-8''''filname escape sequence " funciona con todos los navegadores excepto Safari. Y el único personaje que se reemplaza con Safari es el €. Creo que puedo vivir con eso. Gracias ¡tú!

EDIT 3: Longitud del nombre de archivo

Noté algunos problemas de longitud del nombre de archivo.

  • Internet Explorer: los nombres de los archivos pueden tener 147 caracteres. Si la cadena no contiene secuencias de escape, esa es la longitud del nombre del archivo. Si lo hace, el nombre del archivo puede variar. El nombre del archivo resultante es más corto que 147 caracteres. Pero es diferente. Usé 2 secuencias de escape y el nombre de archivo acortó 5 caracteres y utilicé muchas secuencias de escape y el nombre de archivo acortó onyl 2 caracteres. No pude encontrar una regla aquí.
  • Los otros navegadores no parecen tener ese problema. Guardarían el archivo si el sistema de archivos puede manejarlo. Intenté, por ejemplo, 250 caracteres y los navegadores dijeron que tenía que reducir el nombre del archivo (Chrome) o lo hicieron ellos mismos acortándolo a 220 caracteres (Opera) o 210 (Firefox). Sin embargo, Opera cortó el final del archivo. Safari intentó guardar ese largo nombre de archivo y terminó no guardándolo y escribiendo "-1" en la lista de descargas como nombre de archivo.