c++ - sito - seo h2 vs h3



Caratteri speciali nel nome file di Content-Disposition (1)

Questo thread è un duplicato di Come codificare il parametro filename dell'intestazione Content-Disposition in HTTP? Ma poiché questa domanda è stata posta molto tempo fa e non c'è ancora una risposta soddisfacente (secondo me), vorrei chiedere ancora.

Sviluppo un'applicazione C ++ CGI che fornisce file che possono contenere caratteri speciali nei loro nomi come
" strano # € = {}; nomefile.txt "

Non sembra esserci alcuna possibilità di impostare il Content-Dispostion HTTP in modo che funzioni per ogni browser come

  • Internet Explorer
  • Firefox
  • Cromo
  • musica lirica
  • Safari

Sarei felice con una soluzione diversa per ogni browser.
Questo è quanto sono arrivato lontano:

Internet Explorer (aggiunte doppie virgolette e sostituite # e;)

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

Firefox (le doppie virgolette sembrano funzionare, nient'altro da fare):

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

Un'altra alternativa funzionante:

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

Cromo

quando si utilizzano solo virgolette, si verificano questi problemi:

  • = scompare nei nomi dei file
  • € sarà sostituito da -

ma questo funziona:

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

musica lirica

Usando le virgolette doppie o usando la sintassi: nomefile * = UTF-8 '' ... produce i seguenti problemi:

  • Più spazi uniti tra loro nei nomi dei file sono ridotti a uno
  • {e} disapear: " ab {} cd.txt " -> " abcd.txt "
  • i nomi dei file vengono interrotti dopo; in esso: " abc; def.txt " -> " abc "

EDIT 2: questo a causa delle limitazioni della lunghezza del nome del file. Questa sintassi funziona 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

  • € sarà sostituito da un personaggio invisibile (usando virgolette doppie)

    no solution that prevents that little problem
    

Il suggerimento dall'altra discussione (menzionata sopra) usando

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

non ha funzionato per me I caratteri di escape non saranno tradotti o il browser vuole salvare in file con il nome della mia applicazione cgi. Questo perché la mia codifica era sbagliata. Non ho codificato secondo RFC 5987. Ma Safari non sta comunque usando questa codifica. Quindi nessuna soluzione per il personaggio € finora.

BTW: un convertitore UTF-8 http://www.rishida.net/tools/conversion/

Ho usato l'ultima versione di ogni browser per questi test:

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

PS: ho provato tutti i caratteri speciali sulla mia tastiera. Ho usato in questo thread solo quelli che hanno creato problemi.

MODIFICARE:

Ho anche provato un nome di file con tutti i caratteri speciali sulla mia tastiera (che sono possibili in un nome di file) e che non ha funzionato come ha fatto con la stringa di test sopra:

Stringa di prova completa:

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

Stringa test codificata:

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

Utilizzando questo metodo:

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

Ho avuto i seguenti risultati:

  • Firefox funziona
  • Chrome funziona
  • IE: $% & () = `'{} [] ² ³ @ € μ ^ ° ~ +' # - _. ,; ü ä ö ß 9.jpg (rimossi i primi 6 caratteri). EDIT 2: questo a causa delle limitazioni di lunghezza del nome del file del browser. Inizia a tagliare il nome del file dall'inizio della stringa. Non sono andato in profondità in questo, ma sembra che i normali nomi di file possano essere lunghi circa 200 caratteri e nomi di file con molte possibilità di fuga ancora di più ma meno di 250. Ma va bene.
  • Opera: 0! § $% & () = `'[] ² ³ @ € μ ^ ° ~ +' # - _. ,; ü ä ö ß 9.jpg (mancano alcuni caratteri come prima). EDIT 2: Ho accorciato la mia stringa di test perché sospettavo la lunghezza del nome "problemi" con Opera come ci sono con IE e ha funzionato anche lì.
  • Safari non funziona con quella sintassi. Questo è stato escluso.

MODIFICA 2:

Lo stato fino ad ora è che la sintassi nomefile * = UTF-8''filename escape sequence " funziona con tutti i browser eccetto Safari.E l'unico personaggio che viene sostituito con Safari è l'€. Credo di poter vivere con quello. tu!

EDIT 3: lunghezza del nome del file

Ho notato alcuni problemi di lunghezza del nome del file.

  • Internet Explorer: i nomi dei file possono avere una lunghezza di 147 caratteri. Se la stringa non contiene sequenze di escape, quella è la lunghezza del nome file. Se lo fa, il nome del file può variare. Il nome del file risultante è più breve di 147 caratteri. Ma è diverso. Ho usato 2 sequenze di escape e il nome del file ha abbreviato 5 caratteri e ho usato molte sequenze di escape e il nome del file è stato abbreviato di 2 caratteri. Non sono riuscito a trovare una regola qui.
  • Gli altri browser non sembrano avere questo problema. Avrebbero salvato il file se il file system fosse in grado di gestirlo. Ho provato ad esempio 250 caratteri e il browser ha detto che devo ridurre il nome del file (Chrome) o lo hanno fatto accorciandolo a 220 (Opera) o 210 (Firefox) caratteri. Opera interrompe il file finendo però. Safari ha provato a salvare quel nome di file lungo e ha finito per non salvarlo e scrivere "-1" nell'elenco di download come nome file.

https://src-bin.com


Answer #1

Firefox, MSIE (a partire dalla versione 9), Opera, Konq e Chrome supportano; MSIE8 e Safari non supportano; altri supporti sono sconosciuti - la codifica definita in RFC 5987.

Si noti che in

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

hai sbagliato la codifica per il personaggio dell'Euro; è il punto codice unicode non è% 80, correggendolo dovrebbe farlo funzionare ovunque tranne Safari (la codifica corretta è% e2% 82% ac).

Test case a:

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





content-disposition