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:
- Tarayıcı başlığının "dosya" bölümünü görmezden görünüyor. Formatım doğru mu?
"
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));
:
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
Bkz. Http://stackoverflow.com/questions/4968272/how-can-i-encode-with-rfc-2231-a-filename-in-php – Gumbo