PHP ZipArchive не-английские имена файлов возвращают фанковые имена файлов в архиве

Этот код работает правильно, чтобы сделать 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 могут помочь, но все, что я пробовал, не работает.

Есть идеи?

PS Как побочный вопрос, есть ли способ не сохранять структуру каталогов в zip?

ETA: Примером $_post может быть www.domain.com/path/ שלום_01. Mp3

Related of "PHP ZipArchive не-английские имена файлов возвращают фанковые имена файлов в архиве"

Ура! Исправлена!

Сначала код, затем объяснение:

 <?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)

Он также работает с: iconv("UTF-8", "CP852", $nameFile);