【问题标题】:Zip file with utf-8 file names带有 utf-8 文件名的 Zip 文件
【发布时间】:2012-12-20 08:18:48
【问题描述】:

在我的网站中,我可以选择下载用户上传的所有图片。问题出在带有希伯来语名称的图像中(我需要文件的原始名称)。我试图解码文件名,但这没有帮助。这是一个代码:

using ICSharpCode.SharpZipLib.Zip;

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(file.Name);
byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes);
string name = iso.GetString(isoBytes);

var entry = new ZipEntry(name + ".jpg");
zipStream.PutNextEntry(entry);
using (var reader = new System.IO.FileStream(file.Name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    byte[] buffer = new byte[ChunkSize];
    int bytesRead;
    while ((bytesRead = reader.Read(buffer, 0, buffer.Length)) > 0)
    {
        byte[] actual = new byte[bytesRead];
        Buffer.BlockCopy(buffer, 0, actual, 0, bytesRead);
        zipStream.Write(actual, 0, actual.Length);
    }
} 

在 utf-8 编码后,我得到这样的希伯来文文件名:??????.jpg 我的错误在哪里?

【问题讨论】:

  • 什么是新的ZipEntry?我不知道这是新的System.IO.Compression 命名空间的一部分。 j#?
  • 这是 ICSharpCode.SharpZipLib.Zip 库

标签: c# asp.net .net asp.net-mvc zip


【解决方案1】:

Unicode(UTF-8 是一种二进制编码)可以表示比其他 8 位编码更多的字符。此外,您没有进行正确的转换,而是进行了重新解释,这意味着您的文件名是垃圾。你真的应该阅读来自Joel on Unicode的文章。

...

看完文章你应该知道C#中的string可以存储unicode数据,所以你可能不需要对file.Name做任何转换,可以直接传给ZipEntry如果库不包含编码处理错误,则构造函数(这总是可能的)。

【讨论】:

  • 嗨。感谢您的回复和文章。如果我不执行编码块,我的 zip 中的文件名如下:ëàâàüëò Çàîé_1.jpg
【解决方案2】:

尝试使用

ZipStrings.UseUnicode = true;

它应该是 ICSharpCode.SharpZipLib.Zip 命名空间的一部分。

之后你可以使用类似的东西

var newZipEntry = new ZipEntry($"My ünicödë string.pdf");

并像往常一样将条目添加到流中。在 C# 之前,您不需要对字符串进行任何转换。

【讨论】:

    【解决方案3】:

    您进行了错误的转换,因为 C# 中的字符串已经是 unicode。 您使用什么工具来检查存档中的文件名? 默认情况下,Windows ZIP 实现对文件名使用系统 DOS 编码,而其他实现可以使用其他编码。

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 2013-06-04
      • 2016-07-27
      • 2018-03-03
      • 2017-03-17
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      相关资源
      最近更新 更多