Распаковка zip архивов

bebeka

Новичок
Здравствуйте!

Проблема с кодировкой при распаковке zip архива, сам архив создается нормально, с кодировкой имен файлов cp866, но при распаковке возникают ошибки, если файл написан на кириллице.

1. Если имя файла это одно слово удаляется первая его буква
2. Если имя файла содержит несколько слов, удаляется первое слово.

Вот происходит удаление некоторые символов, после удаление кириллица отображается нормально. ( все что остается от названия .. отображается нормально )

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

Может быть при распаковке на сервер, меняется кодировка с cp866 на другую ? или что может быть ?
 

bebeka

Новичок
PHP:
function extractZip($zipFile = '', $dirFromZip = '') {
	// Папка для распаковки.
    $zipDir = 'folder';
	
    $zip = zip_open($zipFile);

    if ($zip) {
        while ($zip_entry = zip_read($zip)) {
			// Перекодируем с CP866 в CP1251
            $completePath = $zipDir . dirname(iconv('CP866', 'CP1251', zip_entry_name($zip_entry)));
            $completeName = $zipDir . iconv('CP866', 'CP1251', zip_entry_name($zip_entry));
			
            if (!file_exists($completePath) && preg_match('#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)))) {
                $tmp = '';
                foreach (explode('/', $completePath) as $k) {
                    $tmp .= $k . '/';
                    if (!file_exists($tmp)) {
                        @mkdir($tmp, 0777);
                    }
                }
            }
           
            if (zip_entry_open($zip, $zip_entry, "r")) {
                if (preg_match( '#^' . $dirFromZip . '.*#', dirname(zip_entry_name($zip_entry)))) {
                    if ($fd = @fopen($completeName, 'w+')) {
                        fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
                        fclose($fd);
                    } else {
                        mkdir($completeName, 0777);
                    }
					
                    zip_entry_close($zip_entry);
                }
            }
        }
		
        zip_close($zip);
    }
	
    return true;
}

extractZip('test.zip');
И все, имена файлов будут корректно отображаться при распаковке.
 
Сверху