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?)
sumber
Jawaban:
Saya pikir Anda harus mengunduh binari resmi dari repositori PHP Windows dan menginstalnya (perhatikan jalur instalasi).
Setelah itu, Anda harus mengonfigurasi apache untuk menggunakan biner baru, bukan yang dijalankan secara default. Sederhana:
Temukan
httpd.conf
file Anda di folder WAMP (sesuatu seperti C: \ wamp \ bin \ apache \ ApacheXXX \ conf \ httpd.conf) - mungkin juga melalui trayicon.Oke, sekarang Anda menemukannya menemukan pencocokan string
LoadModule php5_module
Bagus, ganti saja baris ini dengan baris baru Anda
php5_module
yang mungkin ada di c: /php/php5apache2_2.dll (Anda menyimpan jalur instalasi!). Menghasilkan sesuatu sepertiLoadModule php5_module "c:/php/php5apache2_2.dll"
Voila. Setel ulang wamp server dan uji aplikasi Anda dengan versi php build terbaru untuk windows.
Saya tidak yakin ini akan menyelesaikan masalah Anda, tetapi pasti cara yang nyata untuk dilakukan. Jika Anda memiliki masalah pada pengaturan php, baca artikel ini .
Semoga berhasil!
sumber
Tampaknya seolah-olah pertanyaan ini telah di luar sana untuk sementara waktu dan apakah php dikompilasi dengan flag unicode atau tidak tidak mempengaruhi itu dukungan unicode, tetapi jika Anda perlu menentukan apakah gambar PE yang diberikan kemungkinan dikompilasi dengan versi Unicode dari Windows API, dapat Anda gunakan
dumpbin
untuk memeriksa impor kernel32.dll yang digunakan. Ini bukan sesuatu yang saya akan lakukan secara pragmatis, tetapi dalam keadaan darurat, dapat bekerja untuk diagnosa.Sebagai contoh, sebuah executable Unicode bisa daftar:
mencatat jumlah fungsi yang diakhiri dengan W, alias Lebar untuk karakter unicode.
Untuk ANSI yang dapat dieksekusi atau DLL, Anda mungkin melihat sesuatu yang lebih dekat ke:
dengan sebagian besar fungsi yang berakhiran A, kita dapat melihat executable kemungkinan besar dikompilasi dengan flag ANSI.
sumber
Berikut adalah beberapa kode yang saya kerjakan untuk menangani
mbstring
masalah yang sedang saya hadapi. Saya akhirnya mengulangi setiap kombinasi pengkodean dan opsi sampai salah satu dari mereka menyajikan output yang saya butuhkan. Saya merasa prosedur semacam ini dapat membantu Anda menemukan jawaban yang Anda cari.Jangan mengandalkan dokumentasi , seperti dalam kasus saya, hasilnya bukan apa yang saya pikir akan dilakukan opsi dan penyandian. Saya ingat dalam pengujian saya, saya akan mendapatkan persegi panjang,? S, dan hal-hal seperti A ~. Pengujian saya persis seperti milik Anda,
print_r
info. Dalam kasus saya, skrip saya mengimpor informasi pelanggan dan penjualan ke Quickbooks, yang tidak dapat menangani UTF-8. (Entah QB itu sendiri tidak bisa atau Driver QODBC tidak bisa) Tildes, kuburan, dan umlats keluar dari pertanyaan.Tautan di atas adalah http://www.php.net/manual/en/function.mb-detect-encoding.php#89915 dan jika Google menemukan Anda di sini, pasti baca itu.
sumber
Saya yakin Anda akan ingin memeriksa untuk melihat apakah PHP dikompilasi dengan mbstring (atau modul mbstring diinstal dan diaktifkan jika Anda menggunakan modul). Jika ekstensi itu diaktifkan harus menyelesaikan masalah Anda. Halaman ini harus memberi tahu Anda segala yang perlu Anda ketahui untuk membuatnya berfungsi.
sumber