带有utf-8文件名的Zip文件

时间:2012-12-20 08:18:49

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

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

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 我的错误在哪里?

3 个答案:

答案 0 :(得分:1)

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

...

现在您已经阅读了本文,您应该知道C#字符串中可以存储unicode数据,因此您可能不需要对file.Name进行任何转换,并且可以直接传递到ZipEntry构造函数,如果库不包含编码处理错误(这总是可行的)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尝试使用

update sub s
inner join (select max(salary) salary from sub) m on m.salary = s.salary
set s.name = 'dd'

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

之后,您可以使用类似的

ZipStrings.UseUnicode = true;

,然后将条目正常添加到流中。在C#中,您不需要对字符串进行任何转换。