परिदृश्य: (PHP में) मैं अंतर्राष्ट्रीय वर्ण का समर्थन करने के एक UTF-8 इनकोडिंग स्ट्रिंग ($name
) के साथ एक फ़ॉर्म सबमिट किया है। फॉर्म जमा करने पर (जीईटी के माध्यम से), मैं एक सीएसवी डाउनलोड फ़ाइल बना रहा हूं। मुझे फ़ाइल का नाम स्ट्रिंग + .csv
("$name.csv"
) होना चाहिए। एक पश्चिमी वर्ण सेट के लिए मैं ऐसा करके यह ठीक कर सकते हैं:पीएचपी: आरएफसी-2231 एन्कोड करने के लिए कैसे के रूप में UTF-8 स्ट्रिंग सामग्री-विन्यास फ़ाइल नाम
header("Content-Disposition: attachment; filename=\"$name\"");
लेकिन अन्य वर्ण सेट के लिए, डाउनलोड फ़ाइल के नाम कचरा पत्र + .csv
(जैसे ×œ×œ× ×›×•×ª×¨×ª.csv
के रूप में) है। मैं की तरह कुछ करने के लिए RFC 2231 का पालन करने की कोशिश कर रहा हूँ:
header("Content-Disposition: attachment; filename*=UTF-8''$name");
लेकिन मैं एक जोड़े को समस्याओं है लगता है:
- ब्राउज़र हेडर के "फ़ाइल नाम" भाग की उपेक्षा करने लगता है। क्या मेरा प्रारूप सही है?
मुझे
$name
हेक्साडेसिमल में एन्कोड किए गए ऑक्टेट्स के प्रत्येक अक्षर को एन्कोड करने की आवश्यकता है, जैसे "This%20is%20%2A%2A%2Afun%2A%2A%2A
"। क्या किसी के पास यह ठीक से करने के लिए कोई कार्य है? मैं कोडित निम्नलिखित लेकिन मुझे नहीं लगता कि यह सही है:$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); }
है वहाँ किसी को भी इस के साथ अनुभव है और सही रास्ते पर मुझे सेट कर सकते हैं?
header("Content-Disposition: attachment; filename*=UTF-8''".rawurlencode($name));
सीधे सवालों के जवाब देने के लिए:
आंतरिक पीएचपी स्ट्रिंग्स के लिए स्ट्रिंग-बिल्डरों का उपयोग करता है, तो '$ hex_ary' अनावश्यक है में स्ट्रिंग टुकड़े भंडारण। आपको केवल '$ हेक्स =' 'का उपयोग करना चाहिए;' फिर प्रत्येक टुकड़े को इसमें संलग्न करें। – manixrock
देखें http://stackoverflow.com/questions/4968272/how-can-i-encode-with-rfc-2231-a-filename-in-php – Gumbo