Je suis en train d'écrire un gestionnaire de fichiers et de numériser des répertoires et de traiter avec le renommage de fichiers qui peuvent avoir des caractères multioctets. Je travaille en local sur Windows/Apache PHP 5.3.8, avec les noms de fichiers dans un répertoire:
- filename.jpg
- имяфайла.jpg
- file件name.jpg
- פילענאַמע.jpg
- 文件名.jpg
Des tests sur un serveur UNIX woked amende. Tester en local sur Windows à l'aide d' glob('./path/*')
ne retourne que le premier, filename.jpg
.
À l'aide de scandir()
, le bon nombre de fichiers est retourné au moins, mais j'ai des noms comme ?????????.jpg
(note: ceux-ci sont régulièrement des points d'interrogation, pas la � caractère.
Je vais finir par avoir besoin d'écrire une fonction de recherche pour rechercher récursivement par le biais de l'ensemble de l'arborescence pour les noms de fichiers correspondant à un modèle ou à une certaine extension de fichier, et j'ai supposé glob()
serait le bon outil pour cela, plutôt que de scanner tous les fichiers et de faire le filtrage et la matrice de la construction dans le code de l'application. Je suis ouvert à des propositions de remplacement en cas de besoin.
En supposant que c'était un problème courant, j'ai immédiatement cherché sur Google et de Débordement de Pile et n'a rien trouvé, même relative. Est-ce un Windows question? PHP lacune? Quelle est la solution: est-ce que je peux faire?
Addendum: vous ne savez Pas comment liées à ce qui est, mais l' file_exists()
est également de retour en FALSE
de ces fichiers, en passant en plein de chemin d'accès absolu (à l'aide de Notepad++, le fichier php en lui-même est l'encodage UTF-8 sans BOM). Je suis certain que le chemin d'accès est correct, en tant que voisins des fichiers sans caractères multioctets retour TRUE
.
EDIT: glob()
peut trouver un fichier nommé filename-äöü.jpg
. Auparavant, dans ma .htaccess
le fichier, j'ai eu AddDefaultCharset utf-8
, que je n'ai pas pensé avant. filename-äöü.jpg
a l'impression qu' filename-���.jpg
. Le seul effet d'enlever cette htaccess la ligne semblait avoir était maintenant que le nom de fichier s'imprime normalement.
J'ai supprimé l' .htaccess
le fichier complètement, et c'est bien mon script de test dans son intégralité (j'ai changé quelques noms de fichier à partir de l'original post):
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Sortie en local sur 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
)
Sortie à distance sur un serveur UNIX:
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
)
Puisque c'est un serveur différent, indépendamment de la plate - forme de configuration pourraient être différents, donc je ne sais pas quoi penser, et je ne peux pas entièrement épingler sur Windows (peut-être mon installation de PHP, des paramètres ini, ou de configuration d'Apache). Des idées?