2012-04-05 10 views
10

यहाँ फ़ाइल नाम के कुछ उदाहरण है:PHP में मल्टीबाइट फ़ाइल नामों को एन्कोड कैसे करें और उन्हें जावास्क्रिप्ट में डीकोड करें?

漢語.jpg (Chinese) 
Федерация.jpg (Russian) 
AbÇöişÜĞ.jpg (Turkish, ISO-8859-9) 
... 

मैं rawurlencode(mb_convert_encoding($file, "UTF-8", mb_detect_encoding($file))) की कोशिश की है, लेकिन यह काम नहीं कर रहा,% 3F (नियमित प्रश्न चिह्न) के रूप में मुद्रित सभी चीनी और रूसी अक्षर और सभी तुर्की वर्ण निकाल दिए जाते हैं।

मैं विंडोज, PHP 5.3 पर परीक्षण कर रहा हूं।

केवल मुझे मिला समाधान केवल एन्कोडिंग दर्ज करना है: rawurlencode(mb_convert_encoding($file, "UTF-8", "ISO-8859-9")) यह केवल तुर्की वर्णों के लिए काम करता है।

वैसे, mb_detect_encoding($file) हमेशा उपरोक्त फ़ाइलों के लिए "यूटीएफ -8" देता है।

संपादित करें:
के बाद मैं निम्नलिखित कोड भाग गया मुझे लगता है कि mb_convert_encoding() नहीं कर सकते मेरी समस्या का समाधान:

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("mp", FilesystemIterator::UNIX_PATHS)); 
$iterator = new RegexIterator($iterator, '/^.+\.(gif|jpg|jpeg|png)$/i', RegexIterator::GET_MATCH); 

foreach ($iterator as $file) 
{ 
    foreach (mb_list_encodings() as $encoding) 
     var_dump(rawurlencode(mb_convert_encoding($file[0], "UTF-8", $encoding)) . " : " . $encoding); 
} 

मुझे लगता है कि इस एन्कोडिंग के बारे में कुछ है, लेकिन मैं कैसे करना है पता नहीं है।

+0

mb_detect_encoding() सर्वज्ञ नहीं है और बार-बार असफल हो जायेगी, सिर्फ इसलिए कि यह बताने के लिए लगभग असंभव है यकीन है कि क्या पाठ का एक हिस्सा एन्कोडिंग का उपयोग करता है के लिए। –

उत्तर

1

तो, मुख्य बात यह है कि अधिकांश ट्रांसपोर्ट (नेटवर्क, फाइलें, आरपीसी) उन पात्रों को चाहते हैं जो अधिकतर बाइट हैं। यूआरएल एन्कोडिंग (% एफएफ) इनपुट डेटा को प्रति चरित्र बाइट होने की अपेक्षा करता है।

तो आपको क्या करना है यूटीएफ 8 का उपयोग करना है। यह बहु-बाइट वर्ण लेगा और इसमें से 1 बाइट वर्णों की एक स्ट्रिंग बना देगा। इस स्ट्रिंग से, आप सामान्य रूप से एएससीआई कर सकते हैं चीजें कर सकते हैं। (एकल बाइट) इनकोडिंग

mb_internal_encoding("UTF-8"); 

अब आप अपने आंतरिक तार और फ़ाइल नाम आदि के सभी UTF-8 हो जाएगा:

आप क्या करना चाहते क्या स्पष्ट php के लिए एन्कोडिंग सेट है। यहां से आप फ़ाइल नाम AS-IS को प्रतिबिंबित कर सकते हैं और यह परिवहन को एन्कोड किए गए डेटा के रूप में हिट करेगा। जावास्क्रिप्ट से, आपको बस इतना करना है कि AJAX का उपयोग करके एक अनुरोध भेजें, और ब्राउज़र में उपयोग करने के लिए तैयार सभी को स्वचालित रूप से आपके लिए डीकोड किया जाएगा :) बस सुनिश्चित करें कि आप अपनी सामग्री-प्रकार को अपनी HTML फ़ाइल में सेट करें, इस के रूप में आपके डिफ़ॉल्ट जेएस एन्कोडिंग के रूप में इस्तेमाल किया जाएगा।

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> 
+0

यदि मैं 'mb_internal_encoding (" UTF-8 ") का उपयोग करता हूं; 'कोड के शीर्ष पर अभी भी गलत एन्कोडिंग' rawurlencode (mb_convert_encoding ($ file [0]," UTF-8 ")); '(उदाहरण के लिए अभी भी रूसी वर्ण एन्कोड किए गए हैं % 3F (?)) – ahk

+0

आपको mb_convert_encoding ($ file [0], "UTF-8") का उपयोग नहीं करना चाहिए, या यहां तक ​​कि कच्चेरलेकोडिंग भी अगर आप डेटा को वापस प्रतिबिंबित कर रहे हैं (php डिफ़ॉल्ट रूप से –

+0

I द्वारा सभी स्ट्रिंग्स UTF-8 बना देगा। पहले उन्हें इस्तेमाल नहीं किया था, लेकिन जब मैं सिर्फ फाइलनामों को प्रतिबिंबित करता हूं तो मुझे अजीब अक्षर मिलते हैं। एचटीएमएल फ़ाइल एन्कोडिंग यूटीएफ -8 बम के बिना है और सामग्री प्रकार utf-8 भी है। केवल समाधान जो मैंने पाया है वह ऊपर है: 'rawurlencode (mb_convert_encoding ($ फ़ाइल, "यूटीएफ -8", "आईएसओ -885 9-9")) 'लेकिन यह केवल तुर्की वर्णों के लिए काम करता है, क्योंकि "आईएसओ -885 9-9" तुर्की के लिए है: http://en.wikipedia.org/wiki/ आईएसओ/IEC_8859-9 – ahk

संबंधित मुद्दे