Архив средствами PHP

Статус
В этой теме нельзя размещать новые ответы.

komyak

Постоялец
Регистрация
4 Фев 2009
Сообщения
483
Реакции
194
Запаковываю на сервере папки и файлы после парсинга, и появилась проблема в кодировке.
Файлы имеют кирилические имена, после упаковки получаются "кракозябры".
Как можно решить проблему и можно ли вообще?
Упаковываю так:
PHP:
<?PHP 
define('ROOT', rtrim(str_replace('\\', '/', dirname(__FILE__)), '/'). '/'); 
$name_arch = ROOT. 'archive.zip'; 
$files_dir = rtrim(ROOT, '/'); 
$files_to_arch = array(); 
require_once(ROOT. 'pclzip.lib.php'); 
for($d = @opendir($files_dir); $file = @readdir($d);) 
{       
    if($file!='.' && $file!='..') 
    { 
        $files_to_arch[]= $file; 
    } 
} 
chdir($files_dir); 
$archive = new PclZip($name_arch); 
$v_list = $archive->create(implode(',', $files_to_arch)); 
if($v_list == 0) 
{ 
   die("Ошибка : ".$archive->errorInfo(true)); 
}else{ 
   echo 'OK'; 
} 
?>
 
Как вариант в транслит перегнать имена и потом обратно при распоковке...


PHP:
<?PHP  
define('ROOT', rtrim(str_replace('\\', '/', dirname(__FILE__)), '/'). '/');  
$name_arch = ROOT. 'archive.zip';  
$files_dir = rtrim(ROOT, '/');  
$files_to_arch = array();  
require_once(ROOT. 'pclzip.lib.php');  


function translet($txt, $type=1)
{
	$array = array("а" => "a", "б" => "b", "в" => "v", "г" => "g", "д" => "d", "е" => "e", "ё" => "e", "ж" => "zh", "з" => "z", "и" => "i", "й" => "j", "к" => "k", "л" => "l", "м" => "m", "н" => "n", "о" => "o", "п" => "p", "р" => "r", "с" => "s", "т" => "t", "у" => "u", "ф" => "f", "х" => "h", "ц" => "c", "ч" => "ch", "ш" => "sh", "щ" => "sh", "ы" => "i", "ь" => "", "ъ" => "", "э" => "e", "ю" => "ju", "я" => "ja", "А" => "a", "Б" => "b", "В" => "v", "Г" => "g", "Д" => "d", "Е" => "e", "Ё" => "e", "Ж" => "zh", "З" => "z", "И" => "i", "Й" => "j", "К" => "k", "Л" => "l", "М" => "m", "Н" => "n", "О" => "o", "П" => "p", "Р" => "r", "С" => "s", "Т" => "t", "У" => "u", "Ф" => "f", "Х" => "h", "Ц" => "c", "Ч" => "ch", "Ш" => "sh", "Щ" => "sh", "Ы" => "i", "Ь" => "", "Ъ" => "", "Э" => "e", "Ю" => "ju", "Я" => "ja",  " " => "-", "\r" => "", "\n" => "",);

	if ($type==1) foreach($array as $val=>$key) $txt = str_replace($val,$key,$txt);
	else foreach($array as $val=>$key) $txt = str_replace($key,$val,$txt);

	return $txt;
}




for($d = @opendir($files_dir); $file = @readdir($d);)  
{        
    if($file!='.' && $file!='..')  
    {  
        $files_to_arch[]= translet($file);
    }  
}  
chdir($files_dir);  
$archive = new PclZip($name_arch);  
$v_list = $archive->create(implode(',', $files_to_arch));  
if($v_list == 0)  
{  
   die("Ошибка : ".$archive->errorInfo(true));  
}else{  
   echo 'OK';  
}



#А вот распоковывать хорошо бы тоже скриптом дабы вернуть все как было...
#
#<?php
#define('ROOT', rtrim(str_replace('\\', '/', dirname(__FILE__)), '/'). '/');  
#$name_arch = ROOT. 'archive.zip';  
#$files_dir = rtrim(ROOT, '/');  
#
#function translet($txt, $type=1)
#{
#	$array = array("а" => "a", "б" => "b", "в" => "v", "г" => "g", "д" => "d", "е" => "e", "ё" => "e", "ж" => "zh", "з" => "z", "и" => "i", "й" => "j", "к" => "k", "л" => "l", "м" => "m", "н" => "n", "о" => "o", "п" => "p", "р" => "r", "с" => "s", "т" => "t", "у" => "u", "ф" => "f", "х" => "h", "ц" => "c", "ч" => "ch", "ш" => "sh", "щ" => "sh", "ы" => "i", "ь" => "", "ъ" => "", "э" => "e", "ю" => "ju", "я" => "ja", "А" => "a", "Б" => "b", "В" => "v", "Г" => "g", "Д" => "d", "Е" => "e", "Ё" => "e", "Ж" => "zh", "З" => "z", "И" => "i", "Й" => "j", "К" => "k", "Л" => "l", "М" => "m", "Н" => "n", "О" => "o", "П" => "p", "Р" => "r", "С" => "s", "Т" => "t", "У" => "u", "Ф" => "f", "Х" => "h", "Ц" => "c", "Ч" => "ch", "Ш" => "sh", "Щ" => "sh", "Ы" => "i", "Ь" => "", "Ъ" => "", "Э" => "e", "Ю" => "ju", "Я" => "ja",  " " => "-", "\r" => "", "\n" => "",);
#
#	if ($type==1) foreach($array as $val=>$key) $txt = str_replace($val,$key,$txt);
#	else foreach($array as $val=>$key) $txt = str_replace($key,$val,$txt);
#
#	return $txt;
#}
#
#for($d = @opendir($files_dir); $file = @readdir($d);)  
#{        
#    if($file!='.' && $file!='..')  
#    {  
#        rename($file,translet($file, 2));
#    }  
#} 
#
#?>

?>

Добавлено через 4 минуты
А ну или ещё проще поиграть с кодеровкой скорее всего utf-8 нужен...

PHP:
<?
$files_to_arch[]= iconv('windows-1251', 'utf-8', $file);
?>

PS. С какой в какую я понятия не имею )) Вложил бы архив сказал точно (наверно )) ).
 
Спасибо, но поздно. =) Пришлось парсинг начинать сначала... Тоже написал функцию транслита. + Пришлось дописывать функцию определения категории.
Но с обратным транслитом интересно =)
 
С обратным транслитом что предложили получатся прикольные имена у файлов с латинскими именами :) лучше к каждому символу добавить чтонить для перевода назад, или вообще индекс файл завести :).
 
Немного вас не понял....
Зачем индекс файл или доп символы для перевода в прежний вид ?
В итоге то имена так и остались прежними только лиш изменен язык перегнать точно так же можно просто в обратно перевернуть замену...
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху