2009-06-10 15 views
7

उदाहरण के लिए मेरे पास एक फ़ाइल नाम है - проба.xml और मैं इसे PHP स्क्रिप्ट से खोलने में असमर्थ हूं।PHP में फ़ाइल कैसे खोलें जिसमें यूनिकोड वर्ण हैं?

$fname = "проба.xml"; 
file_get_contents($fname); 

मैं त्रुटि है कि फ़ाइल मौजूद नहीं है मिलती है: जब मैं file_get_contents को यह पारित

मैं सेटअप PHP स्क्रिप्ट utf-8 लिपि में सभी पाठ की तुलना में में होने की, तो इस प्रकार utf-8 है। इसका कारण यह है कि विंडोज (एक्सपी) में गैर-लैटिन वर्ण वाले सभी फ़ाइल नाम यूनिकोड (यूटीएफ -16) हैं। ठीक तो मैं इस कोशिश की:

$fname = "проба.xml"; 
$res = mb_convert_encoding($fname,'UTF-8','UTF-16'); 
file_get_contents($res); 

लेकिन समस्या बनी रहती है के बाद से file_get_contents यूनिकोड तार को स्वीकार नहीं कर सकते हैं ...

कोई सुझाव?

+0

क्या यह कोड चालू है? आपने file_get_contents में $ res के साथ $ fname स्विच नहीं किया था, या वह सिर्फ एक टाइपो था? – ryanday

+0

यह मेरा टाइपो है। मैंने वास्तव में मूल्यों को स्विच किया था। –

+0

मुझे अपने एक्सपी सिस्टम में मिला और आपका कोड आज़माया। मैंने PHP फ़ाइल को यूनिकोड में सहेजा, और आपने जो लिखा है उसकी प्रतिलिपि/चिपकाया और मैं फ़ाइल (उसी फ़ाइल नाम) को पढ़ सकता हूं। आपकी स्रोत फ़ाइल में कौन सी एन्कोडिंग सहेजी गई है? – ryanday

उत्तर

0

ये अब तक निष्कर्ष हैं:

  1. PHP 5 नहीं कर सकते हैं यूनिकोड वर्ण के साथ खुला फ़ाइल नाम जब तक स्रोत फ़ाइल नाम यूनिकोड है।
  2. PHP 5 (कम से कम विंडोज एक्सपी पर) यूनिकोड में PHP स्रोत को संसाधित करने में सक्षम नहीं है।

इस प्रकार निष्कर्ष पीएचपी 5.

+0

PHP गैर-ASCII वर्णों के साथ केवल एक फ़ाइल नाम खोल सकता है यदि सभी वर्ण Windows स्थापना के डिफ़ॉल्ट कोड पृष्ठ में हैं। यह गैर-ASCII वर्ण वाले स्ट्रिंग अक्षर से निपट सकता है; यह केवल प्रत्यक्ष बाइट्स का उपयोग करता है, तो यह कैसे काम करेगा, आपके टेक्स्ट एडिटर में, स्रोत फ़ाइल को सहेजने वाले एन्कोडिंग पर निर्भर करेगा। एन्कोडिंग कि कई विंडोज़ टेक्स्ट एडिटर गलत तरीके से "यूनिकोड" कहते हैं, वास्तव में यूटीएफ -16LE है, जो गैर-एएससीआईआई-संगत होने के नाते, PHP का सामना नहीं कर सकता है। पृष्ठभूमि के लिए [यह सवाल] देखें (http://stackoverflow.com/q/482342/18936)। – bobince

0

आप की कोशिश कर सकते:

  • कि स्ट्रिंग गुजर _contents file_get है कि अगर काम करेंगे देखने के लिए opendir का उपयोग करने और readdir
  • लिस्टिंग एक निर्देशिका से फ़ाइल नाम के लिए स्ट्रिंग हो रही, या
  • हो रही कोशिश fopen, fread और fclose का उपयोग कर फ़ाइल की सामग्री

आशा है कि इससे मदद मिलती है!

+0

क्या आप यह दिखाने के लिए कोड उदाहरण शामिल कर सकते हैं कि यह कैसे काम करेगा? –

8

अद्यतन में यह संभव नहीं (13 जुलाई '17)

हालांकि डॉक्स यह उल्लेख करने के लिए नहीं है, पीएचपी 7.0 और इसके बाद के संस्करण अंत में यूनिकोड फ़ाइल नाम पर समर्थन करता है बॉक्स के बाहर विंडोज़। PHP की फाइल सिस्टम एपीआई default_charset के अनुसार फ़ाइल नाम स्वीकार और लौटाती है, जो डिफ़ॉल्ट रूप से UTF-8 है।

बग फ़िक्स यहाँ देखें: https://github.com/php/php-src/commit/3d3f11ede4cc7c83d64cc5edaae7c29ce9c6986f


अद्यतन (29 जनवरी '15)

आप PHP एक्सटेंशन डायरेक्ट्री तक पहुंच है, तो आप https://github.com/kenjiuno/php-wfio पर php-wfio.dll स्थापित करने की कोशिश कर सकते हैं और को देखें wfio:// प्रोटोकॉल के माध्यम से फ़ाइलें। विशेष रूप से स्थानीय फ़ाइल का उपयोग, जो पीएचपी बजाय सिस्टम स्थान का उपयोग करता है यूनिकोड का मतलब है के लिए

file_get_contents("wfio://你好.xml"); 

मूल उत्तर

विंडोज पर पीएचपी विरासत "एएनएसआई एपीआई" का उपयोग करता है।

उन फ़ाइलों तक पहुंचने के लिए जिनके फ़ाइल नामों में यूनिकोड है, आपको फ़ाइल सिस्टम को वर्तमान सिस्टम लोकेल के लिए निर्दिष्ट एन्कोडिंग में परिवर्तित करना होगा। यदि फ़ाइल नाम में वर्ण हैं जो निर्दिष्ट एन्कोडिंग में प्रतिनिधित्व योग्य नहीं हैं, तो आप भाग्य से बाहर हैं(अद्यतन: समाधान के लिए ऊपर अनुभाग देखें)scandir इन फ़ाइलों के लिए गड़बड़ी वापस कर देगा और स्ट्रिंग को fopen में वापस कर देगा और समकक्ष असफल हो जाएंगे।

सही एन्कोडिंग का उपयोग करना ढूंढने के लिए, आप <?=setlocale(LC_TYPE,0)?> बुला और MSDN अनुच्छेद https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx पर कोड पृष्ठ पहचानकर्ता (. के बाद संख्या) ऊपर देखकर भी सिस्टम स्थान मिल सकता है।

उदाहरण के लिए, यदि फ़ंक्शन Chinese (Traditional)_HKG.950 देता है, तो इसका मतलब है कि 950 कोडपृष्ठ उपयोग में है और फ़ाइल नाम को बड़े -5 एन्कोडिंग में परिवर्तित किया जाना चाहिए।

$fname = iconv('UTF-8','big-5',"你好.xml"); 
file_get_contents($fname); 

या इस प्रकार यदि आप सीधे के रूप में बिग-5 फ़ाइल को सहेजने: उस मामले में, अपने कोड इस प्रकार, यदि आपकी फ़ाइल को UTF-8 (अधिमानतः बीओएम के बिना) में सहेजा गया है होना होगा

$fname = "你好.xml"; 
file_get_contents($fname); 
+0

इस अद्यतन के लिए धन्यवाद। –

+0

हाय, क्या आप मुझे बता सकते हैं कि .zip फ़ाइल निकालने के लिए, जिसमें फाइल का नाम होता है यूटीएफ -8 है –

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