Ceci est lié à ce post Stack Overflow:
glob () ne trouve pas les noms de fichiers avec des caractères multi-octets sous Windows?
J'ai des problèmes avec PHP et les fichiers contenant des caractères multi-octets sous Windows. Voici mon cas de test:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Sortie correcte sur le serveur UNIX distant:
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
)
Sortie incorrecte localement sous 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
)
Voici un extrait pertinent de la réponse que j'ai choisi d'accepter (qui est en fait une citation d'un article publié en ligne il y a plus de 2 ans):
D'après les commentaires sur cet article: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
La sortie de votre installation PHP sur Windows est facile à expliquer: vous avez installé la mauvaise version de PHP et utilisé une version non compilée pour utiliser la version Unicode de l'API Win32. Pour cette raison, les appels du système de fichiers utilisés par PHP utiliseront l'ancienne API "ANSI" et donc les bibliothèques C / C ++ liées à cette version de PHP essaieront d'abord de convertir votre chaîne PHP encodée en UTF-8 en "ANSI" local page de code sélectionnée dans l'environnement d'exécution (voir la commande CHCP avant de démarrer PHP à partir d'une fenêtre de ligne de commande)
Votre version de Windows n'est PLUS PROBABLEMENT PAS responsable de cette chose étrange. En fait, c'est VOTRE version de PHP qui n'est pas compilée correctement, et qui utilise la version ANSI héritée de l'API Win32 (pour la compatibilité avec les versions 16 bits héritées de Windows 95/98 dont la prise en charge du système de fichiers dans le noyau n'avait en fait pas de lien direct prise en charge d'Unicode, mais utilisé une couche de conversion interne pour convertir Unicode en page de code ANSI locale avant d'utiliser la version ANSI réelle de l'API).
Recompilez PHP en utilisant l'option du compilateur pour utiliser la version UNICODE de l'API Win32 (qui devrait être la valeur par défaut aujourd'hui, et de toute façon toujours la valeur par défaut pour PHP installé sur un serveur qui ne sera JAMAIS Windows 95 ou Windows 98 ...)
Je ne peux pas confirmer si c'est mon problème ou non. J'ai utilisé phpinfo()
et je n'ai rien trouvé d'intéressant, mais je ne savais pas trop quoi chercher. J'utilise XAMPP pour des installations faciles, donc je ne sais vraiment pas exactement comment il a été installé.
J'utilise Windows 7, 64 bits - pardonnez donc mon ignorance, mais je ne sais même pas si "Win32" est pertinent ici. Comment puis-je vérifier si ma version actuelle de PHP a été compilée avec la configuration mentionnée ci-dessus?
- Version PHP : 5.3.8
- Système : Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
- Date de construction : 23 août 2011 11:47:20
- Compilateur : MSVC9 (Visual C ++ 2008)
- Architecture : x86
- Configurer la commande :
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"
Dans le cas où cela est pertinent ou révèle des informations utiles, voici une capture d'écran de ma phpinfo()
(section mbstring):
Comment savoir si mon installation PHP a été "compilée avec la version UNICODE de l'API Win32"? (et est-ce que cela a un sens?)