PHP'nin Win32 API'nin UNICODE sürümü ile derlenmiş olup olmadığını nasıl kontrol edebilirim?


10

Bu, bu Yığın Taşması gönderisiyle ilgilidir:

glob (), Windows'da çok baytlı karakterlere sahip dosya adlarını bulamıyor mu?

PHP ve Windows'da çok baytlı karakterlere sahip dosyalar ile ilgili sorunlar yaşıyorum. İşte benim test durumum:

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

Uzak UNIX sunucusunda Doğru Çıkış:

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
)

Windows'da yerel olarak hatalı çıktı:

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
)

Kabul etmeyi seçtiğim cevaptan ilgili bir alıntı (aslında 2 yıl önce çevrimiçi yayınlanan bir makaleden alıntı):

Bu makaledeki yorumlardan: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php

Windows üzerindeki PHP kurulumunuzun çıktısını açıklamak kolaydır: PHP'nin yanlış sürümünü yüklediniz ve Win32 API'sının Unicode sürümünü kullanmak için derlenmemiş bir sürüm kullandınız. Bu nedenle, PHP tarafından kullanılan dosya sistemi çağrıları eski "ANSI" API'sini kullanacak ve böylece PHP'nin bu sürümüyle bağlantılı C / C ++ kütüphaneleri ilk önce yout UTF-8 kodlu PHP dizesini yerel "ANSI" ye dönüştürmeye çalışacaktır. çalışma ortamında seçilen kod sayfası (PHP'yi komut satırı penceresinden başlatmadan önce CHCP komutuna bakın)

Windows sürümünüz ÇOK MUHTEMELEN bu garip şeyden sorumlu DEĞİLDİR. Aslında, PHP'nin SİZİN doğru derlenmemiş olan sürümüdür ve Win32 API'nin eski ANSI sürümünü kullanır (çekirdekteki dosya sistemi desteği aslında doğrudan olmayan Windows 95/98'in eski 16 bit sürümleriyle uyumluluk için ancak Unicode'u API'nın gerçek ANSI sürümünü kullanmadan önce yerel ANSI kod sayfasına dönüştürmek için dahili bir dönüşüm katmanı kullanmıştır).

Win32 API'nin UNICODE sürümünü kullanmak için derleyici seçeneğini kullanarak PHP'yi yeniden derleyin (bugün varsayılan olması gerekir ve her zaman her zaman varsayılan olarak Windows 95 veya Windows 98 olmayacak bir sunucuda yüklü PHP için varsayılan ...)

Bunun benim sorunum olup olmadığını doğrulayamıyorum. kullandımphpinfo() ve ilginç bir şey bulamadım, ama ne arayacağından emin değildim. Kolay kurulumlar için XAMPP kullanıyorum , bu yüzden tam olarak nasıl kurulduğundan emin değilim.

Windows 7, 64 bit kullanıyorum - bu yüzden cehaletimi affet, ancak "Win32" nin burada alakalı olup olmadığından bile emin değilim. Geçerli PHP sürümümün yukarıda belirtilen yapılandırmayla derlenmiş olup olmadığını nasıl kontrol edebilirim?

  • PHP Sürümü : 5.3.8
  • sistem : Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
  • Kuruluş zamanı : 23 Ağu 2011 11:47:20
  • Derleyici : MSVC9 (Visual C ++ 2008)
  • Mimari : x86
  • Komutu Yapılandır : 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"

Alakalı olması veya faydalı bilgiler vermesi durumunda, işte benim phpinfo()(mbstring bölümüm) ekran görüntüsü :

phpinfo ekran görüntüsü

PHP kurulumumun "Win32 API'nin UNICODE sürümü ile derlenmiş" olup olmadığını nasıl öğrenebilirim? (ve bu gerçekten bir anlam ifade ediyor mu?)


5
Yukarıdakiler seçildi çünkü Wesleys birbirlerini izlemeli.
Wesley

Kodunuzda kodlama ile ilgili bir şey yaptınız mı? Win7-64 kurulumumda bu sorunun tam tersi oldu! Php umlats ve tüm bu ve o alırken araları ile iletişim kurnaz bok eski programı okurdum.
Chris K

Bu soruya kefil olduğum için üzgünüm, umduğum hızlı ve kirli çalışma cevabını alamadım ve sonunda bu projeyi Windows'ta geliştirmeyi bıraktım. Yakında yerel olarak PHP 5.4 yükleyeceğim (bu yüzden soru artık benim için değerli olmayabilir, eğer herkes kabul edilen bir cevap önermek istiyorsa ben tamamen kulaklarım. Bu arada, her yerde upvotes ve teşekkürler.
Wesley Murch

Yanıtlar:


3

Bence PHP Windows deposundan resmi bir ikili dosya indirmelisiniz ve yüklemelisiniz (kurulum yolunu not edin).

Bundan sonra, apache'yi varsayılan olarak taşıdığı yerine yeni ikili dosyayı kullanacak şekilde yapılandırmanız gerekecektir. Basit:

  • Bulmak httpd.confDosyanızı WAMP klasöründe (C: \ wamp \ bin \ apache \ ApacheXXX \ conf \ httpd.conf gibi bir şey) - trayicon'dan geçmek de mümkün olabilir.

  • Tamam, şimdi bir dize eşleştiğini bulduğuna göre LoadModule php5_module

  • İyi, sadece bu satırı php5_modulec: /php/php5apache2_2.dll (kurulum yolunu kaydettiniz!) İçinde yeni olanla değiştirin. Sonuç gibi bir şeyLoadModule php5_module "c:/php/php5apache2_2.dll"

Voila. Wamp sunucusunu sıfırlayın ve Windows için özel olarak php build'in en son sürümü ile uygulamanızı test edin.

Bunun sorununuzu çözeceğinden emin değilim ama kesinlikle gerçek bir yol. Php kurulumunda sorun yaşıyorsanız, bu makaleyi okuyun .

İyi şanslar!


2

Bu soru bir süredir var gibi görünüyor ve php unicode bayraklarıyla derlenip derlenmediği, unicode desteğini etkilemiyor, ancak belirli bir PE görüntüsünün Unicode sürümüne karşı derlenmiş olup olmadığını belirlemeniz gerekiyorsa Windows API, kullanabilirsiniz dumpbin kullanılan kernel32.dll ithalat incelemek için kullanabilirsiniz. Bu tam olarak pragmatik olarak yapacağım bir şey değil, ama bir tutam, teşhis için çalışabilir.

Örneğin, bir Unicode yürütülebilir dosyası şunları listeleyebilir:

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

unicode karakterler için W, aka Wide ile biten işlevlerin sayısını not eder.

ANSI yürütülebilir veya DLL için, daha yakın bir şey görebilirsiniz:

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

A ile biten işlevlerin çoğuyla, yürütülebilir dosyanın büyük olasılıkla ANSI bayrakları ile derlendiğini görebiliriz.


2

Burada karşılaştığım bir mbstringsorunu çözmek için üzerinde çalıştığım bazı kodlar var . Biri ihtiyacım olan çıktıyı gösterene kadar her kodlama ve seçenek kombinasyonu ile yineleme yaptım. Bu tür bir prosedürün aradığınız cevabı bulmanıza yardımcı olabileceğini hissediyorum.

Benim durumumda olduğu gibi, seçenekler ve kodlamalar yapacağımı düşündüğüm gibi belgelere güvenmeyin . Testlerimi hatırlıyorum, dikdörtgenler,? Ler ve A ~ gibi şeyler alırdım. Testlerim seninki gibiydi print_r, bilgi. Benim durumumda, betiğim UTF-8'i işleyemeyen Quickbooks'a müşteri ve satış bilgilerini içeri aktarıyor. (QB'nin kendisi yapamaz veya QODBC Sürücüsü yapamaz) Tildes, mezarlar ve umlatlar söz konusu değil.

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);   

Yukarıdaki bağlantı http://www.php.net/manual/en/function.mb-detect-encoding.php#89915 ve Google sizi burada bulursa kesinlikle okuyun.


1

Ben PHP mbstring ile derlenmiş olup olmadığını kontrol etmek isteyeceksiniz inanıyorum (veya modülleri kullanıyorsanız mbstring modülü yüklü ve etkin). Bu uzantıyı etkinleştirmeniz sorunlarınızı çözmelidir. Bu sayfa size çalışmasını sağlamak için bilmeniz gereken her şeyi anlatmalıdır.


Öneri için teşekkürler, ama mbstring doğru yüklendiğini düşünüyorum. Yazımın sonuna bununla ilgili küçük bir bilgi ekledim. "Doğru derlenmiş PHP SİZİN sürümü ve Win32 API'nın eski ANSI sürümünü kullanan" makalesinde alıntı yapılan yorumlar hakkında daha fazla bilgi edinmek istiyorum , nasıl olduğunu öğrenmek için nasıl ve bunun ilgili olup olmadığı.
Wesley Murch

PHP unicode desteğinin PHP'nin işini yapmak için kullandığı API'daki unicode desteğiyle çok ilgisi olduğunu düşünmüyorum. Ben ikincisi sorun değil, birincisi. (Soruna cevap bulamadığım için özür dilerim; aklı dili denedikten sonra PHP'nin ne kadar korkunç olduğunu bu yüzden çok fazla tecrübem yok.
gparent
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.