পিএইচপি উইন 32 এপিআই এর ইউনিকোড সংস্করণ দিয়ে সংকলিত হয়েছিল কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


10

এটি এই স্ট্যাক ওভারফ্লো পোস্টের সাথে সম্পর্কিত:

গ্লোব () উইন্ডোজে মাল্টিবাইট অক্ষর সহ ফাইলের নাম খুঁজে পাবে না?

আমার পিএইচপি এবং উইন্ডোজে মাল্টিবাইট অক্ষরযুক্ত ফাইলগুলির সাথে সমস্যা হচ্ছে। এখানে আমার পরীক্ষার কেস:

print_r(scandir('./uploads/')); 
print_r(glob('./uploads/*'));

রিমোট ইউনিক্স সার্ভারে সঠিক আউটপুট:

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/files systemm-encoding-and-php

উইন্ডোজ আপনার পিএইচপি ইনস্টলেশন থেকে আউটপুট ব্যাখ্যা করা সহজ: আপনি পিএইচপি এর ভুল সংস্করণ ইনস্টল করেছেন, এবং উইন 32 এপিআই এর ইউনিকোড সংস্করণ ব্যবহার করার জন্য সংকলিত নয় এমন একটি সংস্করণ ব্যবহার করেছেন। এই কারণে, পিএইচপি দ্বারা ব্যবহৃত ফাইল সিস্টেম কলগুলি "এএনএসআই" এপিআই ব্যবহার করবে এবং তাই পিএইচপি এই সংস্করণটির সাথে সংযুক্ত সি / সি ++ গ্রন্থাগারগুলি প্রথমে ইউটিএফ-8-এনকোড পিএইচপি স্ট্রিংটিকে স্থানীয় "এএনএসআই" তে রূপান্তরিত করার চেষ্টা করবে চলমান পরিবেশে কোডপেজ নির্বাচিত হয়েছে (একটি কমান্ড লাইন উইন্ডো থেকে পিএইচপি শুরু করার আগে CHCP কমান্ড দেখুন)

আপনার উইন্ডোজের সংস্করণটি সম্ভবত এই অদ্ভুত জিনিসের জন্য দায়ী নয়। প্রকৃতপক্ষে, এটি পিএইচপি-র আপনার সংস্করণ যা সঠিকভাবে সংকলিত হয়নি এবং এটি উইন 32 এপিআই-এর লেগ্যাসি এএনএসআই সংস্করণ ব্যবহার করে (উইন্ডোজ 95/98 এর লিগ্যাসি 16-বিট সংস্করণের সাথে সামঞ্জস্যের জন্য যার কার্নেলের ফাইল সিস্টেমের সমর্থনটি সরাসরি ছিল না) ইউনিকোডের জন্য সমর্থন, তবে ইউনিকোডকে স্থানীয় এএনএসআই কোডপেজে API এর আসল এএনএসআই সংস্করণ ব্যবহার করার আগে রূপান্তর করতে অভ্যন্তরীণ রূপান্তর স্তর ব্যবহার করেছে)।

উইন 32 এপিআই-র ইউনিকোড সংস্করণটি ব্যবহার করতে সংকলক বিকল্পটি ব্যবহার করে পিএইচপি পুনরায় কম্পাইল করুন (যা আজ ডিফল্ট হওয়া উচিত এবং যাইহোক উইন্ডোজ 95 বা উইন্ডোজ 98 হতে হবে এমন কোনও সার্ভারে পিএইচপি সর্বদা ডিফল্ট হবে না ...)

এটি আমার সমস্যা কিনা তা আমি নিশ্চিত করতে পারছি না। আমি phpinfo()আকর্ষণীয় কিছু ব্যবহার করেছি এবং খুঁজে পেলাম না তবে কী সন্ধান করব তা নিশ্চিত ছিলাম না। আমি সহজ ইনস্টলেশনগুলির জন্য এক্সএএমপিপি ব্যবহার করেছি , সুতরাং এটি কীভাবে ইনস্টল করা হয়েছিল আমি ঠিক তা নিশ্চিত নই।

আমি উইন্ডোজ,, bit৪ বিট ব্যবহার করছি - সুতরাং আমার অজ্ঞতা ক্ষমা করুন, তবে "উইন 32" এখানে প্রাসঙ্গিক কিনা তাও আমি নিশ্চিত নই। আমার বর্তমান পিএইচপি-র সংস্করণটি উপরে বর্ণিত কনফিগারেশনের সাথে সংকলিত হয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?

  • পিএইচপি সংস্করণ : 5.3.8
  • সিস্টেম : উইন্ডোজ এনটি ডব্লিউইএস-পিসি 6.1 বিল্ড 7601 (উইন্ডোজ 7 হোম প্রিমিয়াম সংস্করণ পরিষেবা প্যাক 1) i586
  • বিল্ডের তারিখ : আগস্ট 23 2011 11:47:20
  • কম্পাইলার : MSVC9 (ভিসুয়াল সি ++ 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 স্ক্রিন শট

কীভাবে আমি জানতে পারি যে আমার পিএইচপি ইনস্টলটি "উইন 32 এপিআই এর ইউনিকোডি সংস্করণ দিয়ে সংকলিত হয়েছে"? (এবং এটি আসলে কোনও অর্থ দেয়?)


5
উজ্জীবিত হয়েছে কারণ ওয়েসলিদের প্রত্যেকের জন্য নজর রাখা উচিত।
ওয়েসলি

এনকোডিংয়ের ক্ষেত্রে আপনি কি আপনার স্ক্রিপ্টে কিছু করেছেন? আমার win7-64 ইনস্টল করে আমি এই সমস্যার বিপরীত ছিল! পিএইচপি, উমলাতগুলি এবং সেগুলি এবং ক্রেপ লিগ্যাসির প্রোগ্রামটি পড়ার সাথে বিরতির সাথে যোগাযোগ করত read
ক্রিস কে

এই প্রশ্নে জামিনের জন্য দুঃখিত, আমি আশা করি যে দ্রুত এবং নোংরা কাজের উত্তর পেয়েছিলাম কেবল তা পেলাম না, এবং শেষ পর্যন্ত উইন্ডোজটিতে এই প্রকল্পটি বিকাশ বন্ধ করে দিলাম। আমি শীঘ্রই স্থানীয়ভাবে (উইন্ডোতে) পিএইচপি 5.4 ইনস্টল করব যাতে প্রশ্নটি আর আমার পক্ষে মূল্যবান হতে পারে না, যদি কেউ কোনও গৃহীত উত্তর প্রস্তাব করতে চায় তবে আমি সব কান। এরই মধ্যে, চারপাশে উর্ধ্বতন এবং ধন্যবাদ।
ওয়েসলি মার্চ

উত্তর:


3

আমি মনে করি আপনার পিএইচপি উইন্ডোজ সংগ্রহস্থল থেকে একটি অফিসিয়াল বাইনারি ডাউনলোড করা উচিত এবং এটি ইনস্টল করা উচিত (ইনস্টলেশন পাথ নোট করুন)।

এর পরে আপনাকে ডিফল্টরূপে বহন করা পরিবর্তে নতুন বাইনারিটি ব্যবহার করার জন্য অ্যাপাচি কনফিগার করতে হবে। এটা সহজ:

  • httpd.confডাব্লুএএমপি ফোল্ডারে আপনার ফাইলটি সন্ধান করুন (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"

Voila। ওয়্যাম্প সার্ভারটি রিসেট করুন এবং উইন্ডোজের জন্য বিশেষত পিএইচপি বিল্ডের সর্বশেষতম সংস্করণ দিয়ে আপনার অ্যাপ্লিকেশনটি পরীক্ষা করুন।

আমি নিশ্চিত না যে এটি আপনার সমস্যার সমাধান করবে তবে অবশ্যই আসার এক বাস্তব উপায়। আপনার যদি পিএইচপি সেটআপে সমস্যা হয় তবে এই নিবন্ধটি পড়ুন

শুভকামনা!


2

দেখে মনে হচ্ছে কিছুক্ষণের জন্য এই প্রশ্নটি বাইরে এসেছিল এবং পিএইচপি ইউনিকোড পতাকা সহ সংকলিত হয়েছিল কিনা তা ইউনিকোড সমর্থনকে প্রভাবিত করে না, তবে আপনাকে যদি নির্ধারণ করতে হয় যে প্রদত্ত পিই চিত্রটি সম্ভবত ইউনিকোড সংস্করণের বিপরীতে সংকলিত হয়েছিল কিনা? উইন্ডোজ এপিআই, আপনি dumpbinব্যবহৃত কার্নেল 32.dll আমদানি পরীক্ষা করতে ব্যবহার করতে পারেন । এটি ঠিক এমন কিছু নয় যা আমি ব্যবহারিকভাবে করব, তবে এক চিমটে, ডায়াগনস্টিকসের জন্য কাজ করতে পারে।

উদাহরণস্বরূপ, একটি ইউনিকোড এক্সিকিউটেবল তালিকা করতে পারে:

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

ইউনিকোড অক্ষরের জন্য ডাব্লু, ওরফে ওয়াইডে শেষ হওয়া ফাংশনের সংখ্যা লক্ষ্য করে।

একটি এএনএসআই এক্সিকিউটেবল বা ডিএলএল এর জন্য আপনি আরও কিছু কাছাকাছি দেখতে পাবেন:

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

এ এর বেশিরভাগ ফাংশন সমাপ্তির সাথে আমরা দেখতে পাচ্ছি যে এক্সিকিউটেবলটি সম্ভবত এএনএসআই পতাকা সহ সংকলিত হয়েছিল।


2

আমি যে mbstringসমস্যাটি চালাচ্ছিলাম তা পরিচালনা করার জন্য আমি এখানে কিছু কোড ব্যবহার করেছি । আমি এনকোডিংগুলি এবং বিকল্পগুলির প্রতিটি সংমিশ্রণে পুনরাবৃত্তি শেষ করেছি যতক্ষণ না তাদের মধ্যে একটির আমার প্রয়োজনীয় আউটপুট উপস্থাপন করে। এই ধরণের পদ্ধতিটি আপনি যে উত্তরটি সন্ধান করছেন তা পেতে আপনাকে সহায়তা করতে পারে বলে আমার অনুভূতি রয়েছে।

ডকুমেন্টেশনের উপর নির্ভর করবেন না , যেমনটি আমার ক্ষেত্রে, ফলাফলগুলি বিকল্প এবং এনকোডিংগুলি কী করবে ভেবেছিল তা নয় not আমি আমার পরীক্ষায় স্মরণ করি, আমি আয়তক্ষেত্রগুলি,? গুলি এবং এ like এর মতো জিনিস পেতে পারি ~ আমার পরীক্ষাটি হুবহু আপনার, print_rতথ্য হিসাবে ছিল । আমার ক্ষেত্রে, আমার স্ক্রিপ্টটি গ্রাহক এবং বিক্রয় সম্পর্কিত তথ্য কুইকবুকগুলিতে আমদানি করছে, যা ইউটিএফ -8 পরিচালনা করতে পারে না। (হয় কিউবি নিজেই পারে না বা কিউওডিসিবি ড্রাইভার পারবে না) টিল্ডস, কবর এবং উমলাত এই প্রশ্নের বাইরে।

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 এবং গুগল যদি আপনাকে এখানে খুঁজে পায় তবে অবশ্যই তা পড়ুন।


1

আমি বিশ্বাস করি যে আপনি পিএইচপি এমবিস্ট্রিংয়ের সাথে সংকলিত হয়েছে কিনা তা পরীক্ষা করতে চান (বা আপনি মডিউল ব্যবহার করছেন তবে এমবিস্ট্রিং মডিউল ইনস্টল ও সক্ষম হয়েছে)। এই এক্সটেনশনটি সক্ষম করা আপনার সমস্যার সমাধান করা উচিত। এই পৃষ্ঠায় এটি কাজ করার জন্য আপনার যা জানা দরকার তা বলা উচিত।


পরামর্শের জন্য ধন্যবাদ, তবে আমি বিশ্বাস করি যে এমবিস্ট্রিং সঠিকভাবে ইনস্টল করা আছে। আমি আমার পোস্টের শেষে এ সম্পর্কিত একটি সামান্য তথ্য যুক্ত করেছি। আমি "পিএইচপি এর আপনার সংস্করণ যা সঠিকভাবে সংকলন করা হয়নি, এবং এটি উইন 32 এপিআই-এর উত্তরাধিকার এএনএসআই সংস্করণ ব্যবহার করে" নিবন্ধ থেকে উদ্ধৃত মন্তব্যগুলি সম্পর্কে আরও আগ্রহী , কীভাবে এটি কীভাবে তা খুঁজে বের করতে হবে এবং এটি প্রাসঙ্গিক কিনা।
ওয়েসলি মার্চ

আমার মনে হয় না পিএইচপি-তে ইউনিকোড সমর্থনটির পিআইপিপি তার ব্যবসায়িক ব্যবহারের জন্য যে এপিআই ব্যবহার করে তা ইউনিকোড সমর্থন করার মতো অনেক কিছুই আছে। আমি সন্দেহ করি যে পূর্ববর্তীটি আগেরটির চেয়ে বরং বিষয়টি is (দুঃখিত যে আমার কাছে সমস্যার কোনও উত্তর না থাকলেও; পিএইচপি বুদ্ধিমান ভাষাগুলি চেষ্টা করার পরে কতটা ভয়ঙ্কর তা দেখে আমি বিরক্ত হয়েছি যাতে এর সাথে আমার এতটা অভিজ্ঞতা না হয়)।
অনুমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.