Чтобы обработать этот 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 .