2013-12-15 61 views
0

此代碼可以正常工作,使ZIP文件包含想要的文件,除了存檔中的文件名(非英文文件名)(本例中爲希伯來文)怪異的字符,而不是適當的希伯來字母。PHP ZipArchive非英文文件名在歸檔中返回時髦的文件名

<?php 
$filesfordown = $_POST['GEMin']; 
    if(empty($filesfordown)) 
    { 
     echo "No files were seleceted for download."; 
    } 
    else 
    { 
$zip_name = "RMW." . time() . ".zip"; 
$zip = new ZipArchive; 
$zip->open($zip_name, ZipArchive::CREATE); 
foreach ($filesfordown as $filefordown) { 
    $zip->addFile($filefordown); 
} 
$zip->close(); } 

header('Content-Type: application/zip'); 
header("Content-disposition: attachment; filename='$zip_name'"); 
header('Content-Length: ' . filesize($zip_name)); 
readfile($zip_name); 

ob_flush; 
?> 

我做了一些摸索,好像是的iconv,setlocalte,或mb_convert_encoding可能有幫助,但無論我試過沒有工作。

任何想法?

P.S.作爲一個側面的問題,有沒有辦法在zip中保留目錄結構?

ETA: 的$_post的例子可www.domain.com/path/שלום_01MP3

+0

看起來這可能是舊的錯誤: https://bugs.php.net/bug。 PHP?ID = 53948 – Daniel

回答

5

耶!固定!

首先碼,然後解釋:

<?php 
setlocale(LC_ALL, 'he_IL.UTF-8'); 
$filesfordown = $_POST['GEMin']; 
    if(empty($filesfordown)) 
    { 
     echo "לא נבחרו.. נסה שוב"; 
    } 
    else 
    { 
$zip_name = "RMW" . time() . ".zip"; 
$zip = new ZipArchive; 
$zip->open($zip_name, ZipArchive::CREATE); 
echo "מכין את ההורדה..."; 
foreach ($filesfordown as $filefordown) { 
    $zip->addFile($filefordown, iconv("UTF-8","CP862",basename($filefordown))); 
} 
$zip->close(); 

3事情需要改變。

  1. 確認實際的php文件是UTF-8。
  2. setlocale()最後需要包含.UTF-8。
  3. ZipArchive不能正確處理UTF-8。必須使用CP。希伯來語是CP862。因此,使用額外的選項$localname爲addFile,其基本iconv("UTF-8","CODE_PAGE_REF",$localname)
1

它還適用於:iconv("UTF-8", "CP852", $nameFile);