如何获得正确的 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")))
我使用以下代码通过 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")))