2011-05-28 3 views
1

i ont le code suiviPHP + ZipArchive + langue russe

$zip = new ZipArchive; 
    $res = $zip->open('tmp/articles.zip'); 
    if ($res === TRUE) { 
    $zip->extractTo('tmp/'); 
    $zip->close(); 
    } 

Il fonctionne très bien pour les archives avec les noms de fichiers anglais, mais si je l'ai fait archieve avec des caractères russes, j'ai les noms de fichiers illisibles. Que devrais-je faire? UPD: Cela ne fonctionne pas correctement quand j'utilise aussi "unzip" depuis bash.

+0

Comment l'avez-vous compressé? – Gumbo

+0

Il a été zippé avec winrar. – Ximik

+0

@Ximik: Sur quel système d'exploitation et quel est le système d'exploitation cible? – Gumbo

Répondre

3

Regardez ce code:

$z = new ZipArchive(); 
$res = $z->open('C:\Temp\Temp.zip'); 
if ($res) 
{ 
    $z->extractTo('C:\Temp\Temp'); 
    $z->close(); 
} 

$files = scandir('C:\Temp\Temp'); 
foreach ($files as $filename) 
{ 
    print iconv('cp866', 'utf-8', $filename).PHP_EOL; 
} 

Ce imprime le code des noms de fichiers normaux. Par conséquent, WinRar utilise l'ancien jeu de caractères ms-dos 'cp866' pour le cyrillique.
Espérons que vous pouvez changer ce code pour créer l'algorithme de renommage :)

+0

Merci, ça fonctionne. – Ximik

0

Cette méthode ne fonctionne pas toujours. Je me suis retrouvé à installer une bibliothèque externe comme 7zip pour faire ce travail et cela a résolu le problème. Il est difficile de connaître le charset d'encodage utilisé pour un fichier dans Windows. Dans mon cas, j'ai dû faire cela pour éviter les erreurs dans les noms de fichiers après l'extraction. Voici mes variables:

// Extract file. 
    $tmp_dir = uniqid(); 
    $zip_uri = "test.zip"; 
    $destination_dir = "C:\\Users\\user\\AppData\\Local\\Temp\\$tmp_dir"; 

Ceci est la méthode ZipArchive:

$zip = new ZipArchive(); 
$zip->open($zip_uri); 
if (!$zip->extractTo($destination_dir)) { 
    die("Error extracting files."); 
} 
$zip->close(); 

Cette méthode pas toujours travaillé, mais ce qui suit ne fonctionne admirablement (en utilisant 7Zip):

exec("C:\\7zip\\7za.exe e $zip_uri -o$destination_dir"); 

J'espère que cela aide quelqu'un à ne pas passer des heures à essayer de comprendre le charset d'encodage d'un fichier zippé particulier.