Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание архива, русские буквы воспринимаются неверно 
:(
    Опции темы
CYBERDREAM
Дата 25.2.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Приветствую всех.
Создаю архив с помощью библиотечки: ICSharpCode.SharpZipLib.Zip;
http://www.icsharpcode.net/OpenSource/SharpZipLib/
Русские буквы выводятся неверно
Цитата

ура -> єЁр

как то можно этого избежать.
Заранее спасибо


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
vponomarov
Дата 26.2.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



Не знаю, как в этой библиотеке, но писал недавно свой архиватор и разбирался с примером из МСДНа.
Так вот там для записи строк в файл использовалась такая конструкция
Код

private byte[] ConvertToArray(string name)
{
            return System.Text.Encoding.ASCII.GetBytes(name);
}


и русские буквы превращались в квадратики.
После замены ASCII на Default проблема решилась.

Если есть доступ к исходникам библиотеки, попробуй выполнить нечто подобное.


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
marcusmae
Дата 26.2.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Извините, я, может, не всё понимаю, но почему-то мне всегда казалось, что архиваторы работают с любыми файлами, как с бинарными. И разархивированные байты должны быть в точности такими же, как исходные. Если же байты - это текст, то он должен быть в той же кодировке, что и исходный. Иначе, фтопку такой архиватор, т.к. де факто он повредил данные. Или я ошибаюсь?


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
vponomarov
Дата 26.2.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



Цитата

Извините, я, может, не всё понимаю, но почему-то мне всегда казалось, что архиваторы работают с любыми файлами, как с бинарными. И разархивированные байты должны быть в точности такими же, как исходные. Если же байты - это текст, то он должен быть в той же кодировке, что и исходный. Иначе, фтопку такой архиватор, т.к. де факто он повредил данные. Или я ошибаюсь? 


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


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
marcusmae
Дата 26.2.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(vponomarov @  26.2.2008,  17:01 Найти цитируемый пост)
русские имена файлов становились нечитаемыми после разархивации

Если это не .NET изменил кодировку строк ДО архивации, то тоже похоже на проблему архиватора (ведь он хранит имена файлов у себя в таблицах), или даже на специфику файловой системы. Всякие там NTFSы хранят инфу о локализованных именах и/или хвосты длинных имён в реестре. Я ничего против не имею, просто как бы не получился "костыль" - неуниверсальное решение, работающее лишь в частных случаях.


Это сообщение отредактировал(а) marcusmae - 26.2.2008, 17:18


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
vponomarov
Дата 26.2.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



Цитата

.NET изменил кодировку строк ДО архивации


именно это и делает зловредная функция:
Код

private byte[] ConvertToArray(string name)
{
            return System.Text.Encoding.ASCII.GetBytes(name);
}


т.е. проблема возникает на стадии записи имен файлов во "внутренние таблицы архива".

я не утверждаю, что указанная библиотека поступает так же. Повторюсь еще раз: с данной проблемой я столкнулся разбирая пример МСДНа. Но есть подозрение, что в ICSharpCode.SharpZipLib.Zip делают примерно тоже.


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
CYBERDREAM
Дата 26.2.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



Спасибо за содействие. Внутри файлов все без проблем, а вот наименования страдают.
Вот собственно класс, которым осуществляю архивацию:
Код

using System;
using System.Collections;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;

namespace FolderZipper
{
    public static class ZipUtil
    {
        public static void ZipFiles(string inputFolderPath, string outputPathAndFile, string password)
        {
            ArrayList ar = GenerateFileList(inputFolderPath); // generate file list
            int TrimLength = (Directory.GetParent(inputFolderPath)).ToString().Length;
            // find number of chars to remove     // from orginal file path
            TrimLength += 1; //remove '\'
            FileStream ostream;
            byte[] obuffer;
            string outPath = inputFolderPath + @"\" + outputPathAndFile;
            ZipOutputStream oZipStream = new ZipOutputStream(File.Create(outPath)); // create zip stream
            if (password != null && password != String.Empty)
                oZipStream.Password = password;
            oZipStream.SetLevel(9); // maximum compression
            ZipEntry oZipEntry;
            foreach (string Fil in ar) // for each file, generate a zipentry
            {
                oZipEntry = new ZipEntry(Fil.Remove(0, TrimLength));
                oZipStream.PutNextEntry(oZipEntry);

                if (!Fil.EndsWith(@"/")) // if a file ends with '/' its a directory
                {
                    ostream = File.OpenRead(Fil);
                    obuffer = new byte[ostream.Length];
                    ostream.Read(obuffer, 0, obuffer.Length);
                    oZipStream.Write(obuffer, 0, obuffer.Length);
                }
            }
            oZipStream.Finish();
            oZipStream.Close();
        }


        private static ArrayList GenerateFileList(string Dir)
        {
            ArrayList fils = new ArrayList();
            bool Empty = true;
            foreach (string file in Directory.GetFiles(Dir)) // add each file in directory
            {
                fils.Add(file);
                Empty = false;
            }

            if (Empty)
            {
                if (Directory.GetDirectories(Dir).Length == 0)
                    // if directory is completely empty, add it
                {
                    fils.Add(Dir + @"/");
                }
            }

            foreach (string dirs in Directory.GetDirectories(Dir)) // recursive
            {
                foreach (object obj in GenerateFileList(dirs))
                {
                    fils.Add(obj);
                }
            }
            return fils; // return file list
        }
    }
}

Пока что ничего путного не получилось, вечером пострадаю.


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
vponomarov
Дата 27.2.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



проблему, по-моему, нужно искать внутри одного из этих методов:
Код

oZipEntry = new ZipEntry(Fil.Remove(0, TrimLength));
oZipStream.PutNextEntry(oZipEntry);



--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Sherlock
Дата 27.2.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.5.2007

Репутация: нет
Всего: нет



Да, я тоже думаю, что надо покопаться в самой библиотеке, исходники я так понял есть...
PM MAIL   Вверх
andrey_pro
Дата 3.5.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.9.2007

Репутация: нет
Всего: нет



Хочу поднять тему!

Тоже столкнулся с такой проблемой. Архивирую файлы. В именах файллв встречаются символы « и ».
При архивировании они непонятно почему заменяются на символя < и >.

Сами русские буквы остаются в нормальном виде.
В коде: ZipConstants.DefaultCodePage = 866

Кто нибудь с этим сталкивался?
PM MAIL   Вверх
uranpro
Дата 4.5.2010, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: 1
Всего: 1



из сорца

ZipOutputStream.PutNextEntry
Код

byte[] name = ZipConstants.ConvertToArray(entry.Flags, entry.Name);

ZipConstants.ConvertToArray
Код

        /// <summary>
        /// Convert a string to a byte array
        /// </summary>
        /// <param name="str">
        /// String to convert to an array
        /// </param>
        /// <returns>Converted array</returns>
        public static byte[] ConvertToArray(string str)
        {
            if ( str == null ) {
                return new byte[0];
            }

            return Encoding.GetEncoding(DefaultCodePage).GetBytes(str);
        }

        /// <summary>
        /// Convert a string to a byte array
        /// </summary>
        /// <param name="flags">The applicable <see cref="GeneralBitFlags">general purpose bits flags</see></param>
        /// <param name="str">
        /// String to convert to an array
        /// </param>
        /// <returns>Converted array</returns>
        public static byte[] ConvertToArray(int flags, string str)
        {
            if (str == null) {
                return new byte[0];
            }

            if ((flags & (int)GeneralBitFlags.UnicodeText) != 0) {
                return Encoding.UTF8.GetBytes(str);
            }
            else {
                return ConvertToArray(str);
            }
        }




--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
andrey_pro
Дата 4.5.2010, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.9.2007

Репутация: нет
Всего: нет



в сорцах пробывал менять метод ZipConstants.ConvertToArray
изменял кодировку, но если ставить кодировку не 866 то вместо русских букв - абракабра
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0739 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.