2010-10-04 9 views
5

Senaryo: Ben uluslararası karakterleri desteklemek için bir UTF-8 kodlanmış dize ($name) ile bir form gönderildi (PHP). Formu gönderdikten sonra (GET ile), bir CSV indirme dosyası oluşturuyorum. Dosyanın adını dize + .csv ("$name.csv") olmasını istiyorum. Batılı bir karakter kümesi için ben yaparak bu gayet güzel yapabilir: PHP: RFC 2231 olarak UTF-8 dize kodlamak için nasıl Content-Disposition dosya adı

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

Ama diğer karakter setleri için

, indir dosyasının adı + .csv (örneğin ×œ×œ× ×›×•×ª×¨×ª.csv gibi) çöp harf olduğunu. Ben böyle bir şey yapmak RFC 2231 takip etmeye çalışıyorum:

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

Ama birkaç sorunları var gibi:

  1. Tarayıcı başlığının "dosya" bölümünü görmezden görünüyor. Formatım doğru mu?
  2. "This%20is%20%2A%2A%2Afun%2A%2A%2A" gibi onaltılık olarak kodlanmış $name sekizlilerinin her bir karakterini kodlamam gerekiyor. Bunu düzgün bir şekilde yapacak bir işlevi var mı? Ben kodlanmış aşağıdaki ama doğru olduğunu sanmıyorum:

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

orada herkes bu deneyimi var mı ve doğru yolda beni ayarlayabilirsiniz? doğrudan sorulara cevap verebilmek için

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

:

+0

Dahili PHP, dizeler için dizgi oluşturucuları kullanır, bu nedenle dize parçalarını $ $ 'ın içinde saklamak gereksizdir. Sadece $ hex = ''; 'kullanmalısınız, sonra her bir parçayı ona ekleyin. – manixrock

+0

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

cevap

5

Yani yapmanız gereken tüm başlık() satırı değiştirmektir Bu rawurlencode()

kullanarak RFC 3986 göre dosya adını kodlamak için yeterli olduğunu:

  1. Biçim doğru ancak $ adı içindeki metin rawurlencode() ile kodlanmalıdır.
  2. rawurlencode() hile yapar.
İlgili konular