Проблема при архивировании файлов со специальными символами в PHP + Apache - проблема с кодировкой - PullRequest
3 голосов
/ 29 декабря 2010

еще раз я испытываю проблемы с кодировками при попытке заархивировать файлы в приложении PHP.

Вот предложение, когда имя файла содержит специальные символы, например: 'eñeìá.html', яне в состоянии сжать это правильно .. результат архивирования с помощью функции php AddFile - 'e + ¦e + ¼ + í.html'

Проблемная строка следующая:

$zip-> addFile ($ file_to_add_path, $ file_to_add-> getFilename ());

Я уже пробовал использовать iconv, utf8_decode / encode и т. д., но пока не получилось.Чем ближе я подошел к приведенному выше примеру, когда использовал htmlentities, а затем декодировал их ..

Я запускаю приложение в Xampp в Win XP OS .., что может быть причиной проблемы.

Забавно, что когда я распаковываю файл, названный ранее в приложении, его имя подходит, однако, когда я загружаю заархивированный файл и открываю его ... bleh ..

В любом случае, спасибозаранее всем, кто мог бы помочь мне или немного помочь с этим.Если вам потребуется дополнительная информация, пожалуйста, спросите меня об этом.

С наилучшими пожеланиями

Ответы [ 5 ]

4 голосов
/ 13 февраля 2012

У меня была такая же проблема с символами Центральной Европы, решенная с помощью iconv("UTF-8", "CP852", $string); где CP852 - старая кодировка DOS для Центральной Европы. Так что это может помочь использовать соответствующую кодировку для вашего языка (я думаю, это определяется внутренней конфигурацией алгоритма ZIP или чем-то еще).

2 голосов
/ 29 декабря 2010

Перед архивированием файла попробуйте url-кодировку имени файла:

http://php.net/manual/en/function.urlencode.php

0 голосов
/ 22 марта 2018

Использование

$clean_filename = iconv("ISO-8859-1", "CP860", $filename);

Решил мою проблему с португальскими именами файлов. Измените CP860 в соответствии с кодом, который лучше всего поймает ваши специальные символы.

https://en.wikipedia.org/wiki/Code_page

0 голосов
/ 29 декабря 2010

При использовании iconv пытались ли вы поиграть с любой из опций добавления out_charset? Используя следующий код, я могу создать архив с файлом «los niños.txt», добавленным как «los nios.txt»

<?php
$archivePath = realpath('.\test.zip');
$archive = new ZipArchive;
$opened = $archive->open($archivePath, ZIPARCHIVE::OVERWRITE);
if ($opened === true) {
    $directory = new DirectoryIterator('.');
    foreach($directory as $fileInfo) {
        if ($fileInfo->isDot()) {
            continue;
        }

        if (preg_match('#.*\.txt$#', $fileInfo->getBasename())) {
            $cleanFilename = iconv("UTF-8", "ISO-8859-1//IGNORE", $fileInfo->getFilename());
            $archive->addFile($fileInfo->getRealPath(), $cleanFilename);
        }
    }
    $closed = $archive->close();
    if (!$closed) {
        echo "Could not create ZIP file<br/>";
    }
} else {
    echo "Could not open archive because of code {$opened}<br/>";
}

Обычно, если iconv не может найти подходящую замену для символа UTF-8, он просто удаляет его и оставляет остальную часть имени файла нетронутой.

0 голосов
/ 29 декабря 2010

Вы пытались использовать другой клиент для его открытия, например winRAR или что-то еще? Это, вероятно, разница в версиях. Что бы вы ни создавали, скорее всего, поддерживает символы Юникода, а клиент, с которым вы его открываете, - нет.

...