2010-10-04 15 views
5

Scenariusz: (w PHP) Mam do przesłania formularz z zakodowanym łańcuchem znaków ($name), aby obsługiwać znaki międzynarodowe. Po przesłaniu formularza (przez GET) tworzę plik do pobrania CSV. Chcę, aby nazwa pliku była ta string + .csv ("$name.csv"). Na zachodnim zestawem znaków można zrobić to dobrze wykonując:PHP: RFC-2231 Jak kodować ciąg znaków UTF-8 jako plik z nazwą zbioru?

header("Content-Disposition: attachment; filename=\"$name\""); 

Ale dla innych zestawów znaków, nazwa pliku do pobrania jest litery śmieci + .csv (takich jak ×œ×œ× ×›×•×ª×¨×ª.csv). Staram się postępować zgodnie z RFC 2231, aby zrobić coś takiego:

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

Ale wydaje mi się mieć kilka problemów:

  1. Przeglądarka wydaje się ignorować „filename” część nagłówka. Czy mój format jest właściwy?
  2. Potrzebuję kodować każdy znak oktetów kodowanych w systemie szesnastkowym, np. "This%20is%20%2A%2A%2Afun%2A%2A%2A". Czy ktoś ma funkcję, aby to zrobić właściwie? I kodowane następujących ale nie sądzę, że ma rację:

    $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); 
    } 
    

Czy ktoś tam ma doświadczenie z tym i może ustawić mnie na właściwą drogę?

+0

Wewnętrznie PHP używa string-builderów dla łańcuchów, więc przechowywanie kawałków w '$ hex_ary' jest niepotrzebne. Powinieneś po prostu użyć '$ hex = '';' następnie dołączyć do niego każdy element. – manixrock

+0

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

Odpowiedz

5

wystarczy zakodować nazwę pliku według RFC 3986 za pomocą rawurlencode()

Więc wszystko co musisz zrobić, to zmienić header() linię do:

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

Aby bezpośrednio odpowiedzieć na pytania:

  1. Format jest właściwy, ale tekst w nazwie $ name musi być zakodowany za pomocą rawurlencode().
  2. rawurlencode() załatwia sprawę.