Ошибка при переименовании извлеченного файла Zip на другие языки в PHP

Я использую класс PHP ZipArchive для извлечения файла.zip. Он отлично работает для английского языка, но вызывает проблемы на моем местном языке (THAI).

я использую icov('utf-8','windows-874',$zip->getNameIndex($i)) конвертировать UTF-8 в тайский. Он работает для имени папки / файла, но не работает для извлеченного файла.zip и вызывает эту ошибку:

iconv (): обнаружен недопустимый символ во входной строке

Может кто-нибудь сказать, пожалуйста, в чем здесь проблема?

Мой код PHP

$file = iconv('utf-8', 'windows-874', $_GET['File']);
$path = iconv('utf-8', 'windows-874', $_GET['Path']);

$zip = new ZipArchive;
if ($zip->open($file) === TRUE) {
    // convert to Thai language
    for($i = 0; $i < $zip->numFiles; $i++) {
        $name = $zip->getNameIndex($i);
        //echo iconv("charset zip file", "windows-874", $name);
        //$zip->extractTo($path,$name); -> this problem
    }
    $zip->close();
    echo json_encode('unZip!!!');
} else {
    echo json_encode('Failed');
}

После того, как я извлечу заархивированный файл, имя файла не является тем, которое я установил для него.После того, как я извлечу заархивированный файл, имя файла не является тем, которое я установил для него

Это имя, которое я пытаюсь установить: Это имя, которое я пытаюсь установить

Вот мой заархивированный файл:

https://www.dropbox.com/s/9f4j04lkvsyuy63/test.zip?dl=0

ОБНОВИТЬ
Я попытался разархивировать файл в Windows XP, там он отлично работает, но не в Windows 7.

1 ответ

Вы, вероятно, должны попробовать mb_detect_encoding() для помощи с этим - см. Код ниже. Возможно, вам придется расширить этот код, если у вас также есть проблемы с его путем. Просто используйте цикл, если вам нужно это сделать.

$file = iconv('utf-8', 'windows-874', $_GET['File']);
$path = iconv('utf-8', 'windows-874', $_GET['Path']);

$zip = new ZipArchive;
if ($zip->open($file) === TRUE) {
    // convert to Thai language
    for($i = 0; $i < $zip->numFiles; $i++) {
        $name = $zip->getNameIndex($i);
        $order = mb_detect_order();
        $encoding = mb_detect_encoding($name, $order, true);
        if (FALSE === $encoding) {
             throw new UnexpectedValueException(
                sprintf(
                    'Unable to detect input encoding with mb_detect_encoding, order was: %s'
                , print_r($order, true)
                )
             );
        } else {
            $encoding = mb_detect_encoding($name);
            $stringUtf8 = iconv($encoding, 'UTF-8//IGNORE', $name);
            $zip->extractTo($path,$stringUtf8);
        }  
    }
    $zip->close();
    echo json_encode('unZip!!!');
} else {
    echo json_encode('Failed');
}
Другие вопросы по тегам