Использование распакованного файла библиотеки DotNetZip без символов ASCII - PullRequest
4 голосов
/ 11 января 2011

Я пытаюсь распаковать файл, используя библиотеку DotNetZip.

Файл содержит папки и файлы с датскими символами (æøåÆØÅ).

TotalCommander, 7Zip, Windows собственный zip all extractфайлы правильно, но DotNetZip Library искажает датские символы.

Пример: File_æøåÆØÅ.txt становится File_æ¢åÆ¥Å.txt

вместо , содержит ¢.вместо Ø он содержит ¥.

Код:

using (var zipFile = ZipFile.Read(@"File_æøåÆØÅ.zip"))
{
     zipFile.ExtractAll(@"File_æøåÆØÅ",
                        ExtractExistingFileAction.OverwriteSilently);
}

Я использую кодировку по умолчанию (культура "da-DK"), я пробовал другиетакие кодировки, как UTF8 и т. д.

Как разархивировать файл, содержащий имена файлов с датскими символами?

Ответы [ 5 ]

3 голосов
/ 11 января 2011

Чтобы обработать этот zip-файл, при чтении zip-файла явно укажите датскую кодовую страницу:

var encoding = System.Text.Encoding.GetEncoding("da-DK");
using (var zipFile = ZipFile.Read(@"File_æøåÆØÅ.zip", encoding)) {
  zipFile.ExtractAll(@"File_æøåÆØÅ",
                     ExtractExistingFileAction.OverwriteSilently);
} 

Причина, по которой вам нужно сделать это явно:
Спецификация zip допускает две текстовые кодировки для имен файлов и комментариев в zip-файле: IBM437 и UTF8. Когда используется любое из этих совместимых кодировок, метаданные zipfile явно указывают его. DotNetZip или любая библиотека может уверенно использовать кодировку, указанную в zip-файле.

В zip-файле нет способа указать кодировку, которая не является одной из этих двух. Спецификация zip не предоставляет способ сделать это. Некоторые библиотеки или инструменты zip создают файлы zip, которые не соответствуют спецификации в этом отношении; zip-файлы используют текстовые кодировки, такие как «da-DK» или CP950 или что-то еще. Строго говоря, они не соответствуют спецификации, но инструменты все же создают их. Zip-файлы, подобные этому, не редкость.

В подобных случаях некоторые библиотеки или инструменты предполагают, что кодировка, используемая в zip-файле, совпадает с кодировкой по умолчанию на машине. Это небезопасно или гарантированно не работает, но это предположение, которое работает в небольшом случае - когда zip-файл был создан несовместимой библиотекой или инструментом на локальном компьютере. Если вы создаете zip-файл с кодировкой текста по умолчанию (несовместимой), а затем отправляете его из Стокгольма в Шанхай, при использовании стратегии «предположить кодировку по умолчанию» во время чтения произойдет сбой.

DotNetZip не делает предположения. В тех случаях, когда в zip-файле используется несовместимая кодировка текста, в zip-файле нет указания о том, какая кодировка используется, поэтому DotNetZip использует стандартную кодировку - IBM437 - для чтения файла. У DNZ нет возможности узнать, что это «неправильно». Если вы хотите переопределить это поведение, вам нужно использовать метод ZipFile.Read (), который принимает другую кодировку.

Все это описано в документации DotNetZip , в частности в ZipFile.ProvisionalAlternateEncoding .

2 голосов
/ 11 января 2011

Я использовал файловый поток для чтения и, насколько я помню, он работал (DotNetZip-v1.9).Код для чтения:

using (FileStream fs = File.OpenRead(filePath))
{
     ZipFile zf = ZipFile.Read(fs);
     ICollection<ZipEntry> entries = zf.Entries;
     foreach (ZipEntry entry in entries)
     {
          string path = entry.FileName; // 
     }
}

и для создания zip-архива: ZipFile zip = new ZipFile(Encoding.UTF8);

1 голос
/ 26 августа 2015

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

zip.AlternateEncodingUsage = ZipOption.Always;

, опасно, потому что она всегда переопределяет zip-кодирование, несмотря на то, что фактически использует zip.Я использовал сам

zip.AlternateEncoding = System.Text.Encoding.UTF8;
zip.AlternateEncodingUsage = ZipOption.AsNecessary;

Так что используйте utf-8 при необходимости.

Но, что касается обсуждения кодовой страницы - я исправил это в самом dotnetzip (локальная копия, которая у меня есть) и изменилкодовая страница по умолчанию от «ibm437» до «ibm861».

Я использовал инструмент 7-zip и windows zipping для создания специального вида zip и использовал специальный символ «ø» в имени файла.На основании результатов тестирования кодировкой по умолчанию, используемой windows и 7-zip, является «ibm861», а не «ibm437», как указывает большая часть документации.

Исправление можно применить, выполнив поиск по строке «ibm437» и заменив ее на «ibm861»."в самом dotnetzip.

Вот где я нашел упоминание о странице кодирования: http://www.nudoq.org/#!/Packages/DotNetZip/Ionic.Zip/ZipInputStream/P/ProvisionalAlternateEncoding

0 голосов
/ 06 декабря 2015

У меня была проблема с расстегиванием молнии.В zip-файле мое приложение должно прочитать следующие специальные восточноевропейские символы, такие как šđčćž.WinRAR или 7Zip разархивировали его хорошо, но с библиотекой DNZ (IonicZip 1.9.1.8) вместо š я получил µ.

Я пробовал 15 различных вариантов, когда, наконец, обнаружил, что данный zip-файл - ibm852.Теперь этот пример кода работал для меня:

ZipFile zf = new ZipFile(path, System.Text.Encoding.GetEncoding("ibm852"));
zf.ExtractAll(loc, ExtractExistingFileAction.OverwriteSilently);

Установка свойства AlternateEncoding, как в следующем фрагменте, не помогла мне:

using (ZipFile zz = ZipFile.Read(path))
{
    zz.AlternateEncodingUsage = ZipOption.Always;
    zz.AlternateEncoding = System.Text.Encoding.GetEncoding("ibm852");
    zz.ExtractAll(loc, ExtractExistingFileAction.OverwriteSilently);
}

У меня нет времени, чтобы выяснить, почему, вероятно, вы должны установить кодировку при вызове конструктора, потому что я не нашел параметр кодировки в методе Read.

0 голосов
/ 11 января 2011

Это звучит просто как ошибка в "DotNetZip" - вы пробовали SharpZipLib или ZipPackage (в BCL)? Кодировка обычно относится к файлу содержимое , а не к имени; так что это не должно быть фактором.

Вы должны сообщить об этом (с примером) автору.

...