Escenario: (en PHP) Tengo un envío del formulario con un UTF-8 cadena codificado ($name
) para apoyar 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 , cadena + .csv
("$name.csv"
). Para un juego de caracteres occidentales que puedo hacer esto muy bien haciendo:PHP: RFC-2231 Cómo codificar cadena UTF-8, Content-Disposición nombre
header("Content-Disposition: attachment; filename=\"$name\"");
Pero para otros conjuntos de caracteres, el nombre del archivo de descarga es cartas de basura + .csv
(como ×œ×œ× ×›×•×ª×¨×ª.csv
). Estoy tratando de seguir el RFC 2231 para hacer algo como:
header("Content-Disposition: attachment; filename*=UTF-8''$name");
Pero me parece que tienen un par de problemas:
- navegador parece ignorar la parte " nombre de fichero" de la cabecera. ¿Mi formato es correcto?
Necesito codificar cada carácter 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é la siguiente, pero no creo que es justo:$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 establecer en el camino correcto?
Internamente PHP utiliza constructores de cadenas para cadenas, por lo que no es necesario almacenar las cadenas en '$ hex_ary'. Debería simplemente usar un '$ hex = '';' luego agregarle cada pieza. – manixrock
Ver http://stackoverflow.com/questions/4968272/how-can-i-encode-with-rfc-2231-a-filename-in-php – Gumbo