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

时间:2015-02-12 13:40:53

标签: c# encoding zip

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

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

这个名字通常由瑞典字符组成,例如ÅÄÖåäö。当我打开拉链并查看名称时,瑞典字符会出现乱码,如“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);

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

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

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

这可能无法涵盖所有​​转换,从我从主题来源收集的内容,底层代码使用本地计算机(服务器)区域文化的条目名称编码页面。使用该编码显式映射它们已经修复了我的客户端域的问题,但不能保证它是一颗银弹。

答案 1 :(得分:2)

您可以试用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;
        }
    }

答案 2 :(得分:0)

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