Intereting Posts
PHP5 вычисляет диапазон IPv6 от префикса cidr? Ошибка анализа: ошибка синтаксиса, неожиданный $ end в home / search.php в строке 65 Программирование сокетов с использованием android и php Какой-нибудь более сжатый способ установить значения по умолчанию? Модель аутентификации для приложения Android Как добавить / установить изображения на шаблоне PHPOffice / PHPWord? Как отправить адрес доставки в Paypal при использовании Paypal IPN Как поток PHP хранит свои данные? Радио-кнопка всегда принимает логическое значение 0 в laravel Лучшие методы перенаправления? Что делать с типом URL сообщества, например Last.FM или Wikipedia? Zend_Form_Element_File и «Файл превышает заданный размер ini» UIPickerView не может получить вывод массива в Swift 3.0 WordPress: проверьте, есть ли предыдущие сообщения перед отображением ссылки Есть ли способ сохранить целостность объектов при анализе html с помощью DomDocument?

Получение имен файлов UTF-8 для работы с PHP ZipArchive

У меня есть файл, который я хочу добавить в 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(); 

В приведенном выше примере он все еще не обрабатывает японские символы в имени файла, но, по крайней мере, он обрабатывает европейские символы, которые должны будут выполняться пока.