PHP: RFC-2231 Como codificar UTF-8 String como nome de arquivo Disposição de Conteúdo
Cenário: (em PHP) Eu tenho um envio de formulário com umUTF-8 sequência codificada ($name
) para suportar caracteres internacionais. Ao enviar o formulário (via GET), estou criando um arquivo de download CSV. Eu quero que o nome do arquivo seja aquelecorda + .csv
("$name.csv"
) Para um conjunto de caracteres ocidentais, posso fazer isso muito bem, fazendo:
header("Content-Disposition: attachment; filename=\"$name\"");
Mas para outros conjuntos de caracteres, o nome do arquivo de download écartas de lixo + .csv
(tal como×œ×œ× ×›×•×ª×¨×ª.csv
) Estou tentando seguir a RFC 2231 para fazer algo como:
header("Content-Disposition: attachment; filename*=UTF-8''$name");
Mas parece que tenho alguns problemas:
O navegador parece ignorar o "nome do arquivo"parte do cabeçalho. Meu formato está correto?Eu preciso codificar cada caractere de$name
octetos codificados em hexadecimal, como "This%20is%20%2A%2A%2Afun%2A%2A%2A
". Alguém tem uma função para fazer isso corretamente? Eu codifiquei o seguinte, mas não acho que esteja certo:
$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);
}
Alguém aí tem experiência com isso e pode me colocar no caminho certo?