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

Тема в разделе "PHP Pro", создана пользователем komyak, 2 июл 2010.

Статус темы:
Закрыта.
  1. komyak

    komyak

    Регистр.:
    4 фев 2009
    Сообщения:
    482
    Симпатии:
    183
    Запаковываю на сервере папки и файлы после парсинга, и появилась проблема в кодировке.
    Файлы имеют кирилические имена, после упаковки получаются "кракозябры".
    Как можно решить проблему и можно ли вообще?
    Упаковываю так:
    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'

    ?>
     
  2. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Как вариант в транслит перегнать имена и потом обратно при распоковке...


    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. С какой в какую я понятия не имею )) Вложил бы архив сказал точно (наверно )) ).
     
    komyak нравится это.
  3. komyak

    komyak

    Регистр.:
    4 фев 2009
    Сообщения:
    482
    Симпатии:
    183
    Спасибо, но поздно. =) Пришлось парсинг начинать сначала... Тоже написал функцию транслита. + Пришлось дописывать функцию определения категории.
    Но с обратным транслитом интересно =)
     
  4. CNiks0N

    CNiks0N lamp.root

    Регистр.:
    28 ноя 2008
    Сообщения:
    230
    Симпатии:
    48
    С обратным транслитом что предложили получатся прикольные имена у файлов с латинскими именами :) лучше к каждому символу добавить чтонить для перевода назад, или вообще индекс файл завести :).
     
  5. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Немного вас не понял....
    Зачем индекс файл или доп символы для перевода в прежний вид ?
    В итоге то имена так и остались прежними только лиш изменен язык перегнать точно так же можно просто в обратно перевернуть замену...
     
Статус темы:
Закрыта.