Я создаю некоторые .txt-файлы (с греческими символами) через php-скрипт с кодировкой UTF-8. Когда я пытаюсь загрузить и прочитать эти файлы с ftp, все работает нормально (без проблем с кодировкой).
Когда я застегиваю эти файлы в zip-архив, я столкнулся с проблемой кодирования со всеми греческими символами и символами newLines.
zip-скрипт:
$zip = new ZipArchive(); $filename = "my_zip.zip"; if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) { exit("cannot open <$filename>\n"); } $files = glob('users/'.$_SESSION['s_uid'].'/*'); // get all file names foreach($files as $file){ // iterate files if(is_file($file)) //$zip->addFile($thisdir . $file, basename($file)); $zip->addFile($thisdir . $file, iconv("UTF-8","UTF-8", basename($file))); //echo $file; // delete file } $zip->close();
Это, по-видимому, неразрешенная ошибка в PHP, которая не может обрабатывать имена файлов в кодировке UTF-8.
Аналогичный вопрос есть и по этому вопросу.
Проблема при записи файлов со специальными символами в PHP + Apache – проблема с кодировкой
Я также столкнулся с проблемой извлечения ZIP-архива с символами UTF8. Я не нашел реального решения этой проблемы (я думаю, что проблема в PECL по-прежнему существует, так как я работаю с 5.6) https://bugs.php.net/bug.php?id=53948
… поэтому я придумал обходное решение, которое включает переименование архивных файлов до их извлечения. С помощью этого обходного пути я могу разрешить пользователям загружать имена файлов UTF8 в их архив, но я просто заменяю специальный символ регулярным выражением.
$zip = new ZipArchive; if ($zip->open($file_path) === true) { for ($i = 0; $i < $zip->numFiles; $i++) { $fname = $zip->getNameIndex($i); $fname_new = // your str replacemenet code... $zip->renameIndex($i, $fname_new);