2010-10-04 5 views
5

Scenario: (in PHP) Ho una forma di presentazione con un UTF-8 stringa codificata ($name) per supportare i caratteri internazionali. Dopo aver inviato il modulo (tramite GET), sto creando un file di download CSV. Voglio che il nome del file sia quello stringa + .csv ("$name.csv"). Per un set di caratteri occidentali posso fare questo bene facendo:PHP: RFC-2231 Come codificare UTF-8 String come Content-Disposition filename

header("Content-Disposition: attachment; filename=\"$name\""); 

Ma per altri set di caratteri, il nome del file da scaricare è lettere spazzatura + .csv (come ad esempio ×œ×œ× ×›×•×ª×¨×ª.csv). Sto cercando di seguire RFC 2231 per fare qualcosa di simile:

header("Content-Disposition: attachment; filename*=UTF-8''$name"); 

Ma mi sembra di avere un paio di problemi:

  1. Browser sembra ignorare la parte "nome" dell'intestazione. Il mio formato è giusto?
  2. Ho bisogno di codificare ogni carattere di $name ottetti codificati in formato esadecimale, come "This%20is%20%2A%2A%2Afun%2A%2A%2A". Qualcuno ha una funzione per farlo correttamente? Ho codificato il seguente, ma non credo che sia giusto:

    $fileName = encodeWordRfc2231($name) . ".csv"; 
    header("Content-Disposition: attachment; filename*=UTF-8''$fileName"); 
    
    function &encodeWordRfc2231($word) { 
        $binArray = unpack("C*", $word); 
        foreach ($binArray as $chr) { 
         $hex_ary[] = '%' . sprintf("%02X", base_convert($chr, 2, 16)); 
        } 
        return implode('', $hex_ary); 
    } 
    

Qualcuno là fuori ha esperienza con questo e mi può impostare sulla strada giusta?

+0

PHP internamente utilizza i costruttori di stringhe per le stringhe, quindi non è necessario archiviare i pezzi di stringa in '$ hex_ary'. Dovresti semplicemente usare un '$ hex = '';' quindi aggiungere ogni pezzo ad esso. – manixrock

+0

Vedere http://stackoverflow.com/questions/4968272/how-can-i-encode-with-rfc-2231-a-filename-in-php – Gumbo

risposta

5

è sufficiente per codificare il nome del file in base al RFC 3986 utilizzando rawurlencode()

Quindi, tutto quello che dovete fare è cambiare la riga di intestazione() a:

header("Content-Disposition: attachment; filename*=UTF-8''".rawurlencode($name)); 

Per rispondere direttamente alle domande:

  1. Il formato è corretto ma il testo all'interno di $ name deve essere codificato con rawurlencode().
  2. rawurlencode() fa il trucco.