Mam następujący kod

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

Działa dobrze w przypadku archiwów z angielskimi nazwami plików, ale jeśli zrobiłem archiwum z rosyjskimi znakami, mam nieczytelne nazwy plików. Co powinienem zrobić?

UPD: Nie działa również poprawnie, gdy używam "rozpakowywania" z basha.

1
Ximik 28 maj 2011, 21:17
@Ximik: Na jakim systemie operacyjnym i jaki jest docelowy system operacyjny?
 – 
Gumbo
28 maj 2011, 21:46
W systemie Windows XP. Docelowym systemem operacyjnym jest Debian. Ale ten sam problem dotyczy również mojego archlinuksa.
 – 
Ximik
28 maj 2011, 21:48
@Ximik: Czyli NTFS/FAT32/FAT16/… do ext3/ext2/…?
 – 
Gumbo
28 maj 2011, 21:51
Problem nie występuje w systemie plików, to samo zachowanie w Win7/Win7 (źródło/cel).
 – 
OZ_
28 maj 2011, 21:53
@OZ_: Więc może to WinRAR. Czy wypróbowałeś inne oprogramowanie?
 – 
Gumbo
28 maj 2011, 21:58

2 odpowiedzi

Najlepsza odpowiedź

Spójrz na ten kod:

$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;
}

Ten kod drukuje normalne nazwy plików.
Tak więc WinRar używa starego zestawu znaków ms-dos 'cp866' dla cyrylicy.
Mam nadzieję, że możesz zmienić ten kod, aby stworzyć algorytm zmiany nazwy :)

3
OZ_ 28 maj 2011, 22:04

Ta metoda nie zawsze działa. Zauważyłem, że instaluję zewnętrzną bibliotekę, taką jak 7zip, aby wykonać tę pracę i to rozwiązuje problem. Trudno poznać kodowanie zestawu znaków używanego do pliku w systemie Windows. W moim przypadku musiałem to zrobić, aby uniknąć błędów w nazwach plików po rozpakowaniu. Oto moje zmienne:

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

To jest metoda ZipArchive:

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

Ta metoda nie zawsze działała, ale następująca działa pięknie (przy użyciu 7Zip):

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

Mam nadzieję, że pomoże to komuś nie spędzać godzin na próbach zrozumienia zestawu znaków kodowania konkretnego skompresowanego pliku.

1
Sanxofon 15 październik 2014, 23:06