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ü :
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?)