PHP: RFC-2231 Cómo codificar la cadena UTF-8 como nombre de archivo de disposición de contenido
Escenario: (en PHP) Tengo un envío de formulario con unUTF-8 cadena codificada ($name
) para admitir caracteres internacionales. Al enviar el formulario (a través de GET), estoy creando un archivo de descarga CSV. Quiero que el nombre del archivo sea esecuerda + .csv
("$name.csv"
) Para un conjunto de caracteres occidental, puedo hacer esto bien haciendo:
header("Content-Disposition: attachment; filename=\"$name\"");
Pero para otros conjuntos de caracteres, el nombre del archivo de descarga escartas de basura + .csv
(como×œ×œ× ×›×•×ª×¨×ª.csv
) Estoy tratando de seguir RFC 2231 para hacer algo como:
header("Content-Disposition: attachment; filename*=UTF-8''$name");
Pero parece que tengo un par de problemas:
El navegador parece ignorar el "nombre del archivo"parte del encabezado. ¿Es correcto mi formato?Necesito codificar cada personaje de$name
octetos codificados en hexadecimal, como "This%20is%20%2A%2A%2Afun%2A%2A%2A
". ¿Alguien tiene una función para hacer esto correctamente? Codifiqué lo siguiente pero no creo que sea correcto:
$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);
}
¿Alguien por ahí tiene experiencia con esto y me puede poner en el camino correcto?