У меня есть файл, который я хочу добавить в Zip с PHP, который закодирован в UTF-8. Вот имя файла: «μ 漢字 ääÖÅ.txt».
Теперь, чтобы получить этот файл даже для сохранения в файловой системе, я должен был сделать это:
$filename = "µ漢字ääÖÅ.txt"; $codepage = 'Windows-' . trim(strstr(setlocale(LC_CTYPE, 0), '.'), '.'); $encoded_filename = iconv('UTF-8', $codepage.'//IGNORE', $filename); file_put_contents($encoded_filename, "text");
Теперь, когда я хочу добавить файл в ziparchive, я использую следующий код:
$zip = new \ZipArchive(); $zip->open('test.zip', \ZIPARCHIVE::CREATE); $zip->addFile($encoded_filename, $encoded_filename); $zip->close();
В результате получается zip-файл, содержащий имя файла «õõÍ + .txt». Как я могу его правильно сохранить?
Я нашел ответ (вроде). В приведенном выше примере $encoded_filename
было изменено с UTF-8 на кодировку Windows-1252 для сохранения в файловой системе. Я понятия не имею, почему Windows-1252 работает при сохранении непосредственно в файловой системе, но НЕ при сохранении в zip-файле с использованием ZipArchive.
Чтобы исправить это, мне пришлось снова закодировать $ filename на другую кодировку CP858.
Пример:
$filename = "µ漢字ääÖÅ.txt"; //encode to windows-1252 to save to the filesystem $encoded_filename = iconv("UTF-8","Windows-1252//IGNORE",$filename); file_put_contents($encoded_filename, "text"); //put in a zip file $zip = new \ZipArchive(); $zip->open('test.zip', \ZIPARCHIVE::CREATE); //encode as CP858 to save into zip file $zip->addFile($encoded_filename, iconv("UTF-8", "CP858//IGNORE", $filename)); $zip->close();
В приведенном выше примере он все еще не обрабатывает японские символы в имени файла, но, по крайней мере, он обрабатывает европейские символы, которые должны будут выполняться пока.