Ini terkait dengan pos Stack Overflow ini:
glob () tidak dapat menemukan nama file dengan karakter multibyte di Windows?
Saya mengalami masalah dengan PHP dan file yang memiliki karakter multibyte di Windows. Inilah kotak ujian saya:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Output yang benar pada server UNIX jarak jauh:
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
)
Output salah pada Windows:
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
)
Berikut kutipan yang relevan dari jawaban yang saya pilih untuk diterima (yang sebenarnya adalah kutipan dari artikel yang diposting online lebih dari 2 tahun yang lalu):
Dari komentar di artikel ini: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
Output dari instalasi PHP Anda di Windows mudah dijelaskan: Anda menginstal versi PHP yang salah, dan menggunakan versi yang tidak dikompilasi untuk menggunakan versi Unicode dari Win32 API. Untuk alasan ini, panggilan filesystem yang digunakan oleh PHP akan menggunakan API "ANSI" yang lama, sehingga pustaka C / C ++ yang terhubung dengan versi PHP ini pertama-tama akan mencoba mengonversi string PHP Anda yang disandikan UTF-8 menjadi lokal "ANSI" codepage dipilih di lingkungan yang berjalan (lihat perintah CHCP sebelum memulai PHP dari jendela baris perintah)
Versi Windows Anda PALING MUNGKIN TIDAK bertanggung jawab atas hal aneh ini. Sebenarnya, ini adalah versi ANDA PHP yang tidak dikompilasi dengan benar, dan yang menggunakan versi lama ANSI dari Win32 API (untuk kompatibilitas dengan versi lama 16-bit Windows 95/98 yang dukungan sistem file di kernel sebenarnya tidak memiliki direct mendukung Unicode, tetapi menggunakan lapisan konversi internal untuk mengonversi Unicode ke codepage ANSI lokal sebelum menggunakan versi ANSI API yang sebenarnya).
Kompilasi ulang PHP menggunakan opsi kompiler untuk menggunakan versi UNICODE dari Win32 API (yang seharusnya menjadi standar hari ini, dan lagi pula selalu default untuk PHP yang diinstal pada server yang TIDAK akan pernah menjadi Windows 95 atau Windows 98 ...)
Saya tidak dapat mengkonfirmasi apakah ini masalah saya atau tidak. Saya menggunakan phpinfo()
dan tidak menemukan sesuatu yang menarik, tetapi saya tidak yakin apa yang harus dicari. Saya telah menggunakan XAMPP untuk instalasi yang mudah, jadi saya benar-benar tidak yakin persis bagaimana itu diinstal.
Saya menggunakan Windows 7, 64 bit - jadi maafkan ketidaktahuan saya, tapi saya bahkan tidak yakin apakah "Win32" relevan di sini. Bagaimana saya dapat memeriksa apakah versi PHP saya saat ini dikompilasi dengan konfigurasi yang disebutkan di atas?
- Versi PHP : 5.3.8
- Sistem : Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition Paket Layanan 1) i586
- Tanggal Bangun : 23 Agustus 2011 11:47:20
- Kompiler : MSVC9 (Visual C ++ 2008)
- Arsitektur : x86
- Konfigurasikan Perintah :
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"
Jika itu relevan atau mengungkapkan informasi yang berguna, berikut adalah cuplikan layar phpinfo()
(bagian mbstring) saya:
Bagaimana saya bisa mengetahui apakah instalasi PHP saya "dikompilasi dengan versi UNICODE dari Win32 API"? (dan apakah itu benar-benar masuk akal?)