2011-05-28 110 views
1

我有被跟隨代碼PHP + ZipArchive +俄語

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

它工作正常的英文文件名的檔案,但如果我用俄語字符由archieve,我有不可讀文件名。我該怎麼辦?

UPD:當我使用bash中的「解壓縮」時它無法正常工作。

+0

你是如何壓縮它的? – Gumbo 2011-05-28 17:36:35

+0

它與winrar壓縮。 – Ximik 2011-05-28 17:40:01

+0

@Ximik:什麼是操作系統和目標操作系統? – Gumbo 2011-05-28 17:46:26

回答

3

看看這段代碼:

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

此代碼打印正常的文件名。
因此,WinRar使用古老的ms-dos charset'cp866'。
希望你可以改變這個代碼來創建重命名算法:)

+0

謝謝,它的工作原理。 – Ximik 2011-05-28 18:05:28

0

這種方法並不總是有效。我發現自己安裝了一個像7zip這樣的外部庫來完成這項工作,並解決了這個問題。很難知道在Windows中用於文件的編碼字符集。 在我的情況下,我不得不這樣做,以避免提取後的文件名錯誤。 這裏是我的變量:

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

這是ZipArchive方法:

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

這種方法並不總是工作,但下列情況做工精美(使用7Zip的):

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

希望它能幫助別人花費數小時試圖找出特定壓縮文件的編碼字符集。