2010-03-15 8 views
0

Sur OS-X (PHP5.2.11) J'ai un fichier: siësta.doc (et mille autres avec les noms de fichier Unicode) et je veux convertir les noms de fichiers en web- format de consommable (a-zA-Z0-9.). Si je hardcode le nom de fichier ci-dessus, je peux faire la conversion droite:Problème de codage avec preg_replace() et scandir()

<?php 
    $file = 'siësta.doc'; 
    echo preg_replace("/[^a-zA-Z0-9.]/u", '_', $file); 
    // Output: si_sta.doc 
?> 

Mais si je lis les noms de fichiers avec scandir, j'ai des conversions étranges:

<?php 
    $files = scandir(DIRNAME); 
    foreach ($files as $file) { 
    echo preg_replace("/[^a-zA-Z0-9.]/u", '_', $file); 
    // Output for the file above: sie_sta.doc 
    } 
?> 

J'ai essayé de détecter la encodage, définissez l'encodage, convertissez-le avec les fonctions iconv. J'ai aussi essayé les fonctions mb_. Mais c'était juste pire. Qu'est-ce que j'ai fait de mal?

Merci à l'avance

Répondre

0

Vous ont essayé utf8_encode? (Fonctionne sous Windows au moins)

<?php 
    $files = scandir(DIRNAME); 
    foreach ($files as $file) { 
    echo preg_replace("/[^a-zA-Z0-9.]/u", '_', utf8_encode($file)); 
    // Output for the file above: sie_sta.doc 
    } 
?> 
+0

Hi. Oui, je l'ai essayé d'avant en arrière mais je n'ai pas travaillé. Merci quand même ;) – itarato

0

Le problème est la communication entre windows et php. Il n'est pas possible d'obtenir des noms de fichiers Unicode, car ils dépendent du langage d'application Windows non-Unicode.

La meilleure solution consiste à exécuter une commande dir et obtenir des informations à traiter, mais vous devez le faire si par un cmd, et obtenir les fenêtres des noms courts:

chcp 65001 
dir /x c:\test\ > myinfo.txt 

Il retourne:

El volumen de la unidad C es Windows8_OS 
El número de serie del volumen es: 14A3-025F 

Directorio de C:\test 

22/12/2015 22:11 <DIR>      . 
22/12/2015 22:11 <DIR>      .. 
22/12/2015 22:12     0    a.txt 
22/12/2015 22:10 <DIR>      English 
22/12/2015 22:10 <DIR>   ESPAOL~1  Español 
22/12/2015 22:11 <DIR>   8311~1  ру́сский язы́к 
22/12/2015 22:10 <DIR>   _0B41~1  عربي ,عربى 
22/12/2015 22:10 <DIR>   8F4C~1  北方話 
       1 archivos    0 bytes 
       7 dirs 839.672.786.944 bytes libres 

Ensuite, vous pouvez lire myinfo.txt pour obtenir la connexion entre le nom d'origine et le nom abrégé des fenêtres.

Certaines fonctions PHP fonctionne très bien avec des noms courts et vous pouvez construire et tableau comme si vous avez besoin afficher:

$array['short_name']= $original_name; 

Par exemple: is_dir, is_filefonctionne très bien. Cependant, scandir ou is_readableéchoue avec des noms courts trop. La solution pour utiliser ces fonctions est de réexécuter une commande dir de manière récursive. Pour obtenir des informations à partir du fichier txt, vous pouvez utiliser une expression régulière ou une sous-chaîne, en ignorant les cinq premières lignes et les deux dernières. Par exemple:

for($k=6;$k<(count($array)-2);$k++) ...