diff --git a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs index 57792e3f..8b55dcd6 100644 --- a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs @@ -55,7 +55,7 @@ namespace SharpCompress.Common.Zip.Headers LoadExtra(extra); var unicodePathExtra = Extra.FirstOrDefault(u => u.Type == ExtraDataType.UnicodePathExtraField); - if (unicodePathExtra != null) + if (unicodePathExtra != null && ArchiveEncoding.Forced == null) { Name = ((ExtraUnicodePathExtraField)unicodePathExtra).UnicodeName; } diff --git a/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs b/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs index 38f3a6f3..422ca6f4 100644 --- a/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs @@ -45,7 +45,7 @@ namespace SharpCompress.Common.Zip.Headers LoadExtra(extra); var unicodePathExtra = Extra.FirstOrDefault(u => u.Type == ExtraDataType.UnicodePathExtraField); - if (unicodePathExtra != null) + if (unicodePathExtra != null && ArchiveEncoding.Forced == null) { Name = ((ExtraUnicodePathExtraField)unicodePathExtra).UnicodeName; } diff --git a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs index eb85da5e..4ad7e7db 100644 --- a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs @@ -754,5 +754,37 @@ namespace SharpCompress.Test.Zip Assert.Equal(4, x); } } + + [Fact] + public void Zip_Forced_Ignores_UnicodePathExtra() + { + var zipPath = Path.Combine(TEST_ARCHIVES_PATH, "Zip.UnicodePathExtra.zip"); + using (var stream = File.Open(zipPath, FileMode.Open, FileAccess.Read)) + { + IArchive archive = ArchiveFactory.Open(stream, new ReaderOptions + { + ArchiveEncoding = new ArchiveEncoding + { + Default = Encoding.GetEncoding("shift_jis"), + } + }); + IReader reader = archive.ExtractAllEntries(); + reader.MoveToNextEntry(); + Assert.Equal("궖귛궖귙귪궖귗귪궖귙_wav.frq", reader.Entry.Key); + } + using (var stream = File.Open(zipPath, FileMode.Open, FileAccess.Read)) + { + IArchive archive = ArchiveFactory.Open(stream, new ReaderOptions + { + ArchiveEncoding = new ArchiveEncoding + { + Forced = Encoding.GetEncoding("shift_jis"), + } + }); + IReader reader = archive.ExtractAllEntries(); + reader.MoveToNextEntry(); + Assert.Equal("きょきゅんきゃんきゅ_wav.frq", reader.Entry.Key); + } + } } } diff --git a/tests/TestArchives/Archives/Zip.UnicodePathExtra.zip b/tests/TestArchives/Archives/Zip.UnicodePathExtra.zip new file mode 100644 index 00000000..e716a6b6 Binary files /dev/null and b/tests/TestArchives/Archives/Zip.UnicodePathExtra.zip differ