2010-10-04 10 views
5

परिदृश्य: (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"); 

लेकिन मैं एक जोड़े को समस्याओं है लगता है:

  1. ब्राउज़र हेडर के "फ़ाइल नाम" भाग की उपेक्षा करने लगता है। क्या मेरा प्रारूप सही है?
  2. मुझे $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)); 

सीधे सवालों के जवाब देने के लिए:

+0

आंतरिक पीएचपी स्ट्रिंग्स के लिए स्ट्रिंग-बिल्डरों का उपयोग करता है, तो '$ hex_ary' अनावश्यक है में स्ट्रिंग टुकड़े भंडारण। आपको केवल '$ हेक्स =' 'का उपयोग करना चाहिए;' फिर प्रत्येक टुकड़े को इसमें संलग्न करें। – manixrock

+0

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

उत्तर

5

तो तुम सब करने की जरूरत के लिए शीर्ष लेख() लाइन बदल रहा है यह rawurlencode()

का उपयोग करके RFC 3986 के अनुसार फ़ाइल नाम सांकेतिक शब्दों में बदलना करने के लिए पर्याप्त है:

  1. प्रारूप सही है लेकिन $ नाम के अंदर पाठ को rawurlencode() के साथ एन्कोड किया जाना आवश्यक है।
  2. rawurlencode() चाल है।
संबंधित मुद्दे