Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有utf-8文件名的Zip文件_C#_Asp.net_.net_Asp.net Mvc_Zip - Fatal编程技术网

C# 具有utf-8文件名的Zip文件

C# 具有utf-8文件名的Zip文件,c#,asp.net,.net,asp.net-mvc,zip,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[] isoByt

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

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

Unicode(UTF-8是二进制编码之一)可以表示比其他8位编码更多的字符。此外,您并没有进行适当的转换,而是进行了重新解释,这意味着您的文件名将被丢弃。你真的应该读这篇文章


既然您已经阅读了这篇文章,您应该知道在
C#
string中可以存储unicode数据,因此您可能不需要对
file.Name
进行任何转换,如果库中不包含编码处理错误,您可以将其直接传递给
ZipEntry
构造函数(这总是可能的)

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

尝试使用

ZipStrings.UseUnicode = true;
它应该是ICSharpCode.SharpZipLib.Zip命名空间的一部分

之后,你可以使用

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

并将条目作为普通项添加到流中。在C#中,您不需要对字符串进行任何转换。

什么是新的
ZipEntry
?我不知道这是新的
System.IO.Compression
名称空间的一部分。这是ICSharpCode.SharpZipLib.Zip libraryHi。谢谢你的回复和文章。如果我不执行编码块,我的zip中会有如下文件名:ëë-ëòëîë1.jpg