Questo è correlato a questo post Stack Overflow:
glob () non riesci a trovare i nomi dei file con caratteri multibyte su Windows?
Sto riscontrando problemi con PHP e file con caratteri multibyte su Windows. Ecco il mio caso di test:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Output corretto sul server UNIX remoto:
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 errato localmente su 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
)
Ecco un estratto pertinente della risposta che ho scelto di accettare (che in realtà è una citazione da un articolo che è stato pubblicato online più di 2 anni fa):
Dai commenti su questo articolo: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
L'output della tua installazione di PHP su Windows è facile da spiegare: hai installato una versione errata di PHP e hai utilizzato una versione non compilata per utilizzare la versione Unicode dell'API Win32. Per questo motivo, le chiamate al filesystem utilizzate da PHP useranno l'API "ANSI" legacy e quindi le librerie C / C ++ collegate a questa versione di PHP proveranno prima a convertire la stringa PHP con codifica UTF-8 nella "ANSI" locale tabella codici selezionata nell'ambiente in esecuzione (consultare il comando CHCP prima di avviare PHP da una finestra della riga di comando)
La tua versione di Windows NON È PROBABILMENTE NON responsabile di questa strana cosa. In realtà, questa è la TUA versione di PHP che non è stata compilata correttamente e che utilizza la versione ANSI legacy dell'API Win32 (per la compatibilità con le versioni legacy a 16 bit di Windows 95/98 il cui supporto del filesystem nel kernel in realtà non aveva diretto supporto per Unicode, ma ha utilizzato un livello di conversione interno per convertire Unicode nella tabella codici ANSI locale prima di utilizzare la versione ANSI effettiva dell'API).
Ricompila PHP usando l'opzione del compilatore per utilizzare la versione UNICODE dell'API Win32 (che dovrebbe essere quella predefinita oggi, e comunque sempre quella predefinita per PHP installato su un server che non sarà MAI Windows 95 o Windows 98 ...)
Non posso confermare se questo è il mio problema o no. Ho usato phpinfo()
e non ho trovato nulla di interessante, ma non ero sicuro di cosa cercare. Ho usato XAMPP per installazioni facili, quindi non sono sicuro di come sia stato installato.
Sto usando Windows 7, 64 bit - quindi perdona la mia ignoranza, ma non sono nemmeno sicuro se "Win32" è rilevante qui. Come posso verificare se la mia versione attuale di PHP è stata compilata con la configurazione sopra menzionata?
- Versione PHP : 5.3.8
- Sistema : Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
- Data di costruzione : 23 agosto 2011 11:47:20
- Compilatore : MSVC9 (Visual C ++ 2008)
- Architettura : x86
- Configura comando :
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"
Se è pertinente o rivela informazioni utili, ecco una mia schermata phpinfo()
(sezione mbstring):
Come posso sapere se la mia installazione di PHP è stata "compilata con la versione UNICODE dell'API Win32"? (e ha davvero senso?)