2012-01-05 18 views
5

मेरे पास एक निर्देशिका में स्थित एक फ़ाइल है, जिसमें विंडोज एक्सपी मशीन पर डैनिश वर्ण हैं। मैं स्ट्रॉबेरी पर्ल का उपयोग करता हूं और इस फ़ाइल को पढ़ना चाहता हूं। निम्नलिखित कोड ठीक काम करता है:स्ट्रॉबेरी perl में यूनिकोड के साथ लंबे फ़ाइल नाम वाली फ़ाइल को कैसे पढ़ा जाए Win32 :: यूनिकोड :: फ़ाइल का उपयोग नहीं कर रहा है?

use Win32::Unicode::File; 
    # Some code left out.... 
    $fname = $mw -> getOpenFile(-filetypes=>$types); 
    my $fh = Win32::Unicode::File->new; 
    $fh->open('<', $fname); 

GetOpenFile दिनचर्या रुपये से आता है। अब किसी कारण से Win32 :: यूनिकोड :: फ़ाइल में कुछ दुर्भाग्यपूर्ण दुष्प्रभाव हैं जिनके साथ मैं नहीं रह सकता (यह मेरी याददाश्त खाता है, "Out of memory" with simple Win32::Unicode::File readline loop and Strawberry Perl देखें)। अब अगर मैं Win32 :: यूनिकोड :: फ़ाइल इंटरफ़ेस के बिना फ़ाइल खोलने का प्रयास करता हूं तो मुझे कोई फ़ाइल नहीं मिलती है। इसका कारण यह है कि पथ गलत तरीके से घुसपैठ कर देता है। मैंने पथ को Perl: managing path encodings on Windows के अनुसार परिवर्तित करने का प्रयास किया है जो किसी कारण से काम नहीं करता है। मुझे इसे कैसे हल करना चाहिए? मैंने निम्नलिखित कोशिश की है:

use Encode; 
    # Some code left out.... 
    $fname = $mw -> getOpenFile(-filetypes=>$types); 
    my $fh; 
    open($fh, '<', encode("utf8",$fname,Encode::FB_CROAK)); 

और यह काम नहीं करता है। कोई विचार?

अगर मैं अस्पष्ट हूं तो कृपया मुझे क्षमा करें।

सधन्यवाद, माइकल

+1

विकल्प: http://p3rl.org/PerlIO::fse http://p3rl.org/Path::Class:: यूनिकोड – daxim

+1

मेथिंक आपको यूटीएफ 16 को एन्कोडिंग के रूप में उपयोग करना चाहिए। डीबगर में $ fname जैसा दिखता है? –

उत्तर

5
encode("utf8" 

पर्ल फ़ाइलों को खोलने के मानक सी पुस्तकालय आईओ फ़ंक्शन का उपयोग हो जाएगा, और विंडोज पर जहां फ़ाइल नाम मूल रूप से यूनिकोड कर रहे हैं (UTF-16 के पर्दे के पीछे) है कि पुस्तकालय का मतलब किसी विशेष एन्कोडिंग में होने के कारण उस बाइट-उन्मुख इंटरफ़ेस में फ़ाइल नाम की व्याख्या करना है।

यहां समस्या है: एन्कोडिंग कभी भी यूटीएफ -8, या कोई अन्य यूटीएफ नहीं है। यह लोकेल-विशिष्ट डिफ़ॉल्ट एन्कोडिंग है, जिसे एएनएसआई कोड पेज के रूप में जाना जाता है (भ्रामक रूप से)। एक पश्चिमी विंडोज़ पर स्थापित करें cp-1252। आम तौर पर आप यह पता लगा सकते हैं कि Win32::Codepage::get_encoding पर कॉल करके क्या है।

तो अपनी स्ट्रिंग को उस एन्कोडिंग में परिवर्तित करके, आप मूल फ़ाइल समर्थन, का उपयोग करके इसे एक्सेस कर सकते हैं, जब तक फ़ाइल के पथ में सभी वर्ण ANSI कोड पृष्ठ में हैं। एक पश्चिमी मशीन पर डेनिश के लिए ठीक है; एक चीनी मशीन पर डेनिश के लिए, या इसके विपरीत, आपको हमेशा एक फ़ाइल-नहीं मिली त्रुटि मिल जाएगी।

तो यदि आप विंडोज़ में सभी यूनिकोड चरित्र के साथ फ़ाइल नामों का समर्थन करना चाहते हैं तो आपके पास Win32 API का उपयोग करने के अलावा कोई विकल्प नहीं है, क्योंकि Win32::Unicode::File करता है। यह पर्ल के लिए अद्वितीय नहीं है; यूनिकोड फ़ाइल नामों के लिए स्पष्ट समर्थन के बिना अन्य भाषाओं में बिल्कुल वही समस्या है।

+0

धन्यवाद। बहुत बढ़िया जवाब। :) –