अगर PHP Win32 एपीआई के UNICODE संस्करण के साथ संकलित किया गया था, तो मैं कैसे जांच सकता हूं?


10

यह इस स्टैक ओवरफ्लो पोस्ट से संबंधित है:

ग्लोब () विंडोज पर मल्टीबाइट पात्रों के साथ फ़ाइल नाम नहीं मिल सकता है?

मैं 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()(स्क्रीनिंग अनुभाग) का एक स्क्रीन शॉट है :

phpinfo स्क्रीन शॉट

अगर मेरी PHP स्थापित "Win32 एपीआई के UNICODE संस्करण के साथ संकलित" थी तो मुझे कैसे पता चलेगा? (और क्या इससे वास्तव में कोई मतलब है?)


5
अपवोटेड क्योंकि वेस्ले को प्रत्येक अभिभावक के लिए बाहर देखना पड़ता है।
वेस्ले

क्या आपने एन्कोडिंग के संबंध में अपनी स्क्रिप्ट में कुछ भी किया है? मैं अपने win7-64 स्थापित के साथ इस समस्या के विपरीत था! Php umlats और उस सभी और बकवास विरासत कार्यक्रम को पढ़ता है जिसे मैं तोड़ता हूं जब यह मिलता है।
क्रिस के

इस प्रश्न पर जमानत के लिए क्षमा करें, मुझे अभी उस त्वरित और गंदे काम का जवाब नहीं मिला जिसकी मुझे आशा थी, और अंततः विंडोज पर इस परियोजना को विकसित करना बंद कर दिया। मैं जल्द ही स्थानीय रूप से (विंडोज़ पर) PHP 5.4 स्थापित करने जा रहा हूँ, इसलिए सवाल अब मेरे लिए मूल्यवान नहीं हो सकता है, अगर कोई भी मेरे कानों के लिए स्वीकृत उत्तर का सुझाव देना चाहता है। इस बीच, upvotes और चारों ओर धन्यवाद।
वेस्ले मर्क

जवाबों:


3

मुझे लगता है कि आपको PHP विंडोज रिपॉजिटरी से एक इनिशियल बाइनरी डाउनलोड करना चाहिए और इसे इंस्टॉल करना चाहिए (इंस्टॉलेशन पथ पर ध्यान दें)।

उसके बाद आपको नए बाइनरी का उपयोग करने के लिए अपाचे को कॉन्फ़िगर करने की आवश्यकता होगी बजाय इसके कि डिफ़ॉल्ट रूप से। यह आसान है:

  • httpd.confWAMP फ़ोल्डर में अपनी फ़ाइल ढूंढें (C: \ wamp \ bin \ apache \ ApacheXXX \ conf \ httpd.conf जैसी) - यह ट्रायनिक के माध्यम से भी जाना संभव हो सकता है।

  • ठीक है, अब जब आपने पाया कि यह एक स्ट्रिंग मिलान का पता लगाता है LoadModule php5_module

  • अच्छा है, बस इस लाइन को अपने नए के साथ बदल दें php5_moduleजो कि सी में प्रबल है: /php/php5apache2_2.dll (आपने संस्थापन पथ सहेजा है!)। परिणाम में कुछ इस तरहLoadModule php5_module "c:/php/php5apache2_2.dll"

देखा। Wamp सर्वर को रीसेट करें और विशेष रूप से विंडोज़ के लिए php बिल्ड के नवीनतम संस्करण के साथ अपने एप्लिकेशन का परीक्षण करें।

मुझे यकीन नहीं है कि यह आपकी समस्या को हल करेगा लेकिन निश्चित रूप से जाने का एक वास्तविक तरीका है। यदि आपको php सेटअप में समस्या है, तो इस लेख को पढ़ें ।

सौभाग्य!


2

ऐसा लगता है जैसे कि यह सवाल कुछ समय के लिए बाहर हो गया है और यूनीकोड ​​झंडे के साथ php संकलित किया गया था या नहीं, यह यूनिकोड समर्थन को प्रभावित नहीं करता है, लेकिन यदि आपको यह निर्धारित करने की आवश्यकता है कि क्या एक दी गई पीई छवि को यूनिकोड संस्करण के खिलाफ संकलित किया गया था विंडोज एपीआई, आप उपयोग किए dumpbinगए कर्नेल 32.dll आयात की जांच करने के लिए उपयोग कर सकते हैं । यह बिल्कुल ऐसा कुछ नहीं है जिसे मैं व्यावहारिक रूप से करूंगा, लेकिन एक चुटकी में, निदान के लिए काम कर सकता था।

उदाहरण के लिए, एक यूनिकोड निष्पादन योग्य सूची दे सकता है:

               4C CreateFileMappingW
               45 CreateDirectoryW
               33 CompareStringW
              12E GetCurrentDirectoryW
               AF ExpandEnvironmentStringsW
              2F0 SetFileAttributesW

डब्ल्यू में समाप्त होने वाले कार्यों की संख्या को ध्यान में रखते हुए, यूनिकोड के पात्रों के लिए उर्फ ​​वाइड।

ANSI निष्पादन योग्य या DLL के लिए, आप कुछ को इसके करीब देख सकते हैं:

              30A SetCurrentDirectoryA
              15E GetFileAttributesA
              171 GetLastError
               4B CreateDirectoryA
              319 SetFileAttributesA

ए में समाप्त होने वाले अधिकांश कार्यों के साथ, हम देख सकते हैं कि निष्पादन योग्य सबसे अधिक संभावना एएनएसआई झंडे के साथ संकलित था।


2

यहाँ कुछ कोड है जिन पर मैंने काम किया mbstringथा एक समस्या को संभालने के लिए । मैंने एन्कोडिंग और विकल्पों के प्रत्येक संयोजन के माध्यम से पुनरावृत्ति को समाप्त कर दिया, जब तक कि उनमें से एक को मेरे द्वारा आवश्यक आउटपुट प्रस्तुत नहीं किया गया। मुझे लग रहा है कि इस तरह की प्रक्रिया आपको आपके द्वारा मांगे जा रहे उत्तर को खोजने में मदद कर सकती है।

दस्तावेज़ीकरण पर भरोसा न करें , जैसा कि मेरे मामले में, परिणाम वे नहीं थे जो मैंने सोचा था कि विकल्प और एनकोडिंग क्या करेंगे। मुझे अपने परीक्षण में याद है, मुझे आयतें मिलेंगी, और ए ~ जैसी चीजें। मेरा परीक्षण बिल्कुल आपके जैसा था, print_rजानकारी। मेरे मामले में, मेरी स्क्रिप्ट ग्राहक और बिक्री जानकारी को Quickbooks में आयात कर रही है, जो UTF-8 को संभाल नहीं सकती है। (या तो QB स्वयं या QODBC ड्राइवर नहीं कर सकता) Tildes, graves, और umlats प्रश्न से बाहर हैं।

setlocale(LC_CTYPE, 'en_US.UTF-8');
$xmlstr=file_get_contents($file);           
// convert character encoding to get rid of accents, etc
// see http://www.php.net/manual/en/function.mb-detect-encoding.php#89915
// note that unlike ASCII//TRANSLIT and ASCII//TRANSLIT//IGNORE do not work
// in windows 7.
$xmlstr=iconv('UTF-8', 'ASCII//IGNORE', $xmlstr);   

उपरोक्त लिंक http://www.php.net/manual/en/function.mb-detect-encoding.php#89915 है और यदि Google आपको यहां मिलता है, तो अवश्य पढ़ें।


1

मेरा मानना ​​है कि आप यह देखना चाहेंगे कि PHP mbstring के साथ संकलित किया गया था (या यदि आप मॉड्यूल का उपयोग कर रहे हैं तो mbstring मॉड्यूल स्थापित और सक्षम है)। उस एक्सटेंशन को सक्षम करने से आपके मुद्दों को हल करना चाहिए। इस पृष्ठ को आपको वह सब कुछ बताना चाहिए जो आपको काम करने के लिए जानना चाहिए।


सुझाव के लिए धन्यवाद, लेकिन मेरा मानना ​​है कि mbstring सही तरीके से स्थापित है। मैंने अपनी पोस्ट के अंत में इस बारे में थोड़ी जानकारी जोड़ी। मैं उन लेखों के बारे में जानने में दिलचस्पी रखता हूं जो मैंने "PHP के आपके संस्करण जो कि सही तरीके से संकलित नहीं किए गए हैं, लेख से उद्धृत किया है, और जो कि Win32 API के विरासत ANSI संस्करण का उपयोग करता है" , यह कैसे पता करें कि यह मामला है, और यह प्रासंगिक है या नहीं।
वेस्ले मर्च

मुझे नहीं लगता कि PHP में यूनिकोड समर्थन का एपीआई में यूनिकोड समर्थन के साथ बहुत कुछ है जो PHP अपने व्यवसाय को करने के लिए उपयोग करता है। मुझे संदेह है कि उत्तरार्द्ध पूर्व की बजाय मुद्दा है। (क्षमा करें कि मेरे पास हालांकि इस समस्या का कोई जवाब नहीं है; मैं इस बात से निराश हूं कि पूरी तरह से भयानक PHP भाषा भाषाओं को आज़माने के बाद है, इसलिए मुझे इसका उतना अनुभव नहीं है)।
अपराह्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.