2010-10-04 14 views
5

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:

  1. navegador parece ignorar la parte " nombre de fichero" de la cabecera. ¿Mi formato es correcto?
  2. 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?

+0

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

+0

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

Respuesta

5

basta con codificar el nombre de archivo de acuerdo con RFC 3986 utilizando rawurlencode()

Así que todo lo que tiene que hacer es cambiar la línea de cabecera() para:

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

Para responder a las preguntas directamente:

  1. El formato es correcto, pero el texto dentro de $ name debe codificarse con rawurlencode().
  2. rawurlencode() hace el truco.
Cuestiones relacionadas