PHP ZipArchive非英文文件名在归档中返回时髦的文件名


PHP ZipArchive non-English filenames return funky filenames within archive

这段代码可以正常工作,使包含所需文件的ZIP文件具有奇怪的字符,而不是正确的希伯来文字母。

<?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可能会有所帮助,但我尝试的都不起作用。

有什么想法吗?

附言:作为一个附带问题,有没有一种方法可以不将目录结构保存在zip中?

ETA:$_post的一个例子可能是www.domain.com/path/Şدد_01.mp3

耶!固定的

首先是代码,然后是解释:

<?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。因此,addFile使用额外的选项$localname,其基本上为iconv("UTF-8","CODE_PAGE_REF",$localname)

它也适用于:iconv("UTF-8", "CP852", $nameFile);