Come visualizzare un nome file non ASCII nella casella di download del file nei browser?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Non sembra esserci un modo accettato per inviare un parametro header in formato non ascii.

L'intestazione per il download dei file di solito appare come

Disposizione dei contenuti: allegato; filename = " theasciifilename.doc "

Tranne se si rompe una stringa codificata utf8 nel parametro del nome file, Firefox la gestirà bene, mentre IE verrà visualizzata.

Esiste un documento su CodeProject che spiega un metodo per codificare il nome file.

Questo documento codifica B & # 7843; n Ki & # 7875; m K & # 234; .doc in B% e1% ba% a3n% 20Ki% e1% bb% 83m% 20K% c3% aa.doc per esadecimale codifica il byte.

Problema n. 1: il primo carattere di quella stringa: & # 7843; ha un valore di & # 7843; - codifica quel numero in esadecimale e otterrai% a3% 1e. Come ha ottenuto questo ragazzo% e1% ba% a3? (Ovviamente mi manca qualcosa di semplice qui)

Problema n. 2: mentre IE riconosce questa codifica, Firefox no! Cosa fare?

È stato utile?

Soluzione

Rispondi alla domanda n. 1: stai confondendo Unicode e UTF-8. Il valore esadecimale di '?' è 0xA31E tuttavia non è un carattere UTF-8. In UTF-8 quel personaggio richiede tre byte, 0xE1 0xBA 0xA3 . La codifica URL è scarsamente definita per codifiche non ASCII ma% e1% ba% a3 è la codifica UTF-8 valida da utilizzare per quel carattere.

Altri suggerimenti

Le specifiche in sostanza non consentono altro che US-ASCII. Le intestazioni HTTP sono US-ASCII. Il payload di HTTP è impostato su ISO 8859-1, ma si riferisce al corpo del contenuto, non alle intestazioni.

Probabilmente la cosa giusta da fare sarebbe usare la tecnica MIME per codificare i dati non ASCII nelle intestazioni, come descritto in RFC 2047 , ma non ho idea se i browser lo supportino effettivamente.

MODIFICA: Whoops, no, RFC 2047 sezione 5 afferma esplicitamente che il modulo codificato non è consentito nella disposizione dei contenuti. Sembra che tu sia sfortunato - non esiste uno standard.

MODIFICA 2: Esiste uno standard - RFC 2231 definisce come dovrebbe funzionare ora. Ha il supporto di alcuni browser, ma non è supportato in IE. Ho trovato alcuni casi di test che dimostrano come funziona e quale supporto del browser è disponibili.

Per il problema n. 2 è necessario codificare l'URL con il nome del file sia per Internet Explorer che per Firefox. L'unica differenza è che è necessario utilizzare il formato di RFC 2231 in Firefox. Questo vale per Firefox 3 e Internet Explorer 7.

Nel link che hai sopra, e1 ba a3 è la codifica UTF-8 del carattere menzionato, non il codice del carattere.

Rispondi (più o meno) al problema n. 2:

Poiché hai scoperto che lo schema di denominazione in un browser non funziona nell'altro, l'unica soluzione è farlo in modo diverso per ciascun browser, in modo simile all'esempio qui .

Nel caso in cui il collegamento scompaia, la soluzione è sostanzialmente:

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

Ovviamente determinare se il browser è IE da User-agent (che è l'unico modo per farlo) è irto di ogni sorta del solito pericolo.

Per quanto possa sembrare centrico nordamericano, se è importante che funzioni in un gran numero di browser non controlli quale potrebbe essere il blocco o la modifica dell'agente utente, quindi semplicemente evita i caratteri codificati UTF-8 nella nome file e usa sempre " Scarica " o qualcosa del genere.

Sfortunatamente, al momento non esiste un modo unico per funzionare in tutti gli agenti utente.

Vedi http://greenbytes.de/tech/tc2231/ per casi di test, quindi lamentarsi con Microsoft, Google e Apple.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top