यह इस स्टैक ओवरफ्लो पोस्ट से संबंधित है:
ग्लोब () विंडोज पर मल्टीबाइट पात्रों के साथ फ़ाइल नाम नहीं मिल सकता है?
मैं PHP और फ़ाइलों के साथ समस्या कर रहा हूँ जिसमें विंडोज पर मल्टीबाइट अक्षर हैं। यहाँ मेरा परीक्षण मामला है:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
दूरस्थ UNIX सर्वर पर सही आउटपुट:
Array
(
[0] => .
[1] => ..
[2] => filename-äöü.jpg
[3] => filename.jpg
[4] => test이test.jpg
[5] => имя файла.jpg
[6] => פילענאַמע.jpg
[7] => 文件名.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
[2] => ./uploads/test이test.jpg
[3] => ./uploads/имя файла.jpg
[4] => ./uploads/פילענאַמע.jpg
[5] => ./uploads/文件名.jpg
)
विंडोज पर स्थानीय रूप से गलत आउटपुट:
Array
(
[0] => .
[1] => ..
[2] => ??? ?????.jpg
[3] => ???.jpg
[4] => ?????????.jpg
[5] => filename-äöü.jpg
[6] => filename.jpg
[7] => test?test.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
)
यहां एक प्रासंगिक उद्धरण है जिसे मैंने स्वीकार करने के लिए चुना था (जो वास्तव में एक लेख से उद्धरण है जो 2 साल पहले ऑनलाइन पोस्ट किया गया था):
इस लेख की टिप्पणियों से: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
विंडोज पर आपके PHP इंस्टॉलेशन से आउटपुट को समझाना आसान है: आपने PHP का गलत संस्करण स्थापित किया, और Win32 API के यूनिकोड संस्करण का उपयोग करने के लिए संकलित संस्करण का उपयोग नहीं किया। इस कारण से, PHP द्वारा उपयोग की जाने वाली फाइलसिस्टम कॉल लीगेसी "ANSI" API का उपयोग करेगी और इसलिए PHP के इस संस्करण से जुड़े C / C ++ लाइब्रेरी पहले यूटीएफ -8-एन्कोडेड PHP स्ट्रिंग को स्थानीय "एएनएसआई" में बदलने की कोशिश करेंगे। रनिंग वातावरण में चुना गया कोडपेज (कमांड लाइन विंडो से PHP शुरू करने से पहले CHCP कमांड देखें)
आपके विंडोज का संस्करण सबसे अजीब बात है, इस अजीब बात के लिए जिम्मेदार नहीं है। वास्तव में, यह आपका PHP का संस्करण है जिसे सही तरीके से संकलित नहीं किया गया है, और जो Win32 API की विरासत ANSI संस्करण का उपयोग करता है (Windows 95/98 की विरासत 16-बिट संस्करणों के साथ संगतता के लिए जिसका कर्नेल में फाइलसिस्टम समर्थन वास्तव में प्रत्यक्ष था यूनिकोड के लिए समर्थन, लेकिन एपीआई के वास्तविक एएनएसआई संस्करण का उपयोग करने से पहले यूनिकोड को स्थानीय एएनएसआई कोडपेज में परिवर्तित करने के लिए एक आंतरिक रूपांतरण परत का उपयोग किया गया)।
Win32 API के UNICODE संस्करण का उपयोग करने के लिए संकलक विकल्प का उपयोग करके Recompile PHP (जो कि आज डिफ़ॉल्ट होना चाहिए, और वैसे भी हमेशा PHP के लिए डिफ़ॉल्ट रूप से एक सर्वर पर स्थापित होता है जो कभी भी विंडोज़ 95 या विंडोज 98 नहीं होगा ...)
मैं पुष्टि नहीं कर सकता कि यह मेरी समस्या है या नहीं। मैंने इस्तेमाल किया phpinfo()
और कुछ भी दिलचस्प नहीं पाया, लेकिन मुझे यकीन नहीं था कि क्या देखना है। मैं आसान प्रतिष्ठानों के लिए XAMPP का उपयोग कर रहा हूं, इसलिए मुझे वास्तव में यकीन नहीं है कि यह कैसे स्थापित किया गया था।
मैं विंडोज 7, 64 बिट का उपयोग कर रहा हूं - इसलिए मेरी अज्ञानता को क्षमा करें, लेकिन मुझे यकीन नहीं है कि "विन 32" यहां प्रासंगिक है। अगर ऊपर उल्लिखित विन्यास के साथ PHP का मेरा वर्तमान संस्करण संकलित किया गया है, तो मैं कैसे जांच सकता हूं?
- PHP संस्करण : 5.3.8
- सिस्टम : Windows NT WES-PC 6.1 का निर्माण 7601 (विंडोज 7 होम प्रीमियम एडिशन सर्विस पैक 1) i586
- निर्माण तिथि : 23 अगस्त 2011 11:47:20
- संकलक : MSVC9 (विजुअल C ++ 2008)
- आर्किटेक्चर : x86
- कॉन्फ़िगर कमांड :
cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" "--disable-static-analyze"
यदि यह प्रासंगिक है या किसी उपयोगी जानकारी का खुलासा करता है, तो यहां मेरे phpinfo()
(स्क्रीनिंग अनुभाग) का एक स्क्रीन शॉट है :
अगर मेरी PHP स्थापित "Win32 एपीआई के UNICODE संस्करण के साथ संकलित" थी तो मुझे कैसे पता चलेगा? (और क्या इससे वास्तव में कोई मतलब है?)