PHP: RFC-2231 İçerik Eğilimi dosya adı olarak UTF-8 dize kodlamak nasıl

0 Cevap php

Senaryo: (PHP) bir UTF-8 kodlanmış bir dize ($name), uluslararası karakterleri destekleyen bir form gönderme var. (GET) formunu gönderdikten sonra, ben bir CSV dosyası indir oluşturma. Ben dosyanın adı o olmak istiyorum string + .csv ("$name.csv"). Batılı bir karakter kümesi için ben yaparak sadece iyi yapabilirsiniz:

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

Ancak diğer karakter setleri için, indir dosyanın adı garbage letters + .csv (örneğin {[) (2]} gibi). Ben böyle bir şey yapmak için RFC 2231 takip çalışıyorum:

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

Ama ben bir kaç sorun var gibi görünüyor:

  1. Tarayıcı başlığının "filename" kısmını göz ardı etmek gibi görünüyor. Benim biçimi doğru mu?
  2. Ben "This%20is%20%2A%2A%2Afun%2A%2A%2A" gibi onaltılık kodlanmış $name sekizli, her karakteri kodlamak gerekir. Herkes Bunu düzgün bir işlevi var mı? Ben şu kodlu 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 bana doğru yolda ayarlayabilirsiniz?

0 Cevap