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:
- Browser sembra ignorare la parte "nome" dell'intestazione. Il mio formato è giusto?
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?
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
Vedere http://stackoverflow.com/questions/4968272/how-can-i-encode-with-rfc-2231-a-filename-in-php – Gumbo