如何获得正确的 ZipArchive.CreateEntry 名称编码?

How do I get ZipArchive.CreateEntry name encoding right?

我使用以下代码通过 C# 创建一个 zip 存档。

using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Create, false))
{
    var zipEntry = zipArchive.CreateEntry(name + ".pdf");
    ...
}

名称通常由瑞典语字符组成,例如 ÅÄÖ åäö。当我打开 zip 并查看名称时,瑞典字符像这样乱码 "Fl+Âdesm+ñtare.pdf"。

我尝试使用此代码修复名称编码。但是没用。

var iso = Encoding.GetEncoding("ISO-8859-1");
var utf8 = Encoding.UTF8;
var utfBytes = utf8.GetBytes(name);
var isoBytes = Encoding.Convert(utf8, iso, utfBytes);
var isoName = iso.GetString(isoBytes);

有什么想法吗?

您可以试用 DotNetZip 库(通过 NuGet 获取)。这是一个代码示例,其中我使用 cp866 编码:

private string GenerateZipFile(string filename, BetPool betPool)
    {
        using (var zip = new ZipFile(Encoding.GetEncoding("cp866")))
        {
            //zip.Password = AppConfigHelper.Key + DateTime.Now.Date.ToString("ddMMyy");                
            zip.AlternateEncoding = Encoding.GetEncoding("cp866");
            zip.AlternateEncodingUsage = ZipOption.AsNecessary;
            zip.AddFile(filename, "");
            var zipFilename = FormZipFileName(betPool);
            zip.Save(zipFilename);
            return zipFilename;
        }
    }

由于 DotNetZip 是一个死项目并且本文与 google 搜索相关,这里是 IO.Compression 库的替代解决方案:

Archive = New IO.Compression.ZipArchive(Stream, ZipArchiveMode, LeaveOpen, Text.Encoding.GetEncoding(Globalization.CultureInfo.CurrentCulture.TextInfo.OEMCodePage))

这可能不会涵盖所有转换,根据我从有关该主题的来源收集的信息,底层代码使用本地机器(服务器)区域文化的编码页面作为条目名称。使用该编码显式映射它们已经解决了我的客户端域的问题,但不能保证它是灵丹妙药。

使用 (var zip = new ZipArchive(ZipFilePath, ZipArchiveMode.Read, false, Encoding.GetEncoding("cp866")))