Die richtige Arbeit um für dieses Problem als
folgt
class MyEncoder : UTF8Encoding
{
public MyEncoder() : base(true)
{
}
public override byte[] GetBytes(string s)
{
s = s.Replace("\\", "/");
return base.GetBytes(s);
}
}
HINWEIS : Dies ist etwas anders als eine vorherige Antwort.
Der wesentliche Unterschied ist in dem : base(true)
Dies ist wichtig, oder .NET ZipArchive Klasse wird nicht den Encoder als UTF-8-Encoder erkennt und wird nicht den richtigen Mehrzweck Bit markieren und damit das Extrahieren des resultierenden Zip-Datei mit jedem anderen Zip-Programm wird davon ausgehen, dass der Name des Zip-Eintrags in einer Nicht-Unicode-Codierung ist, die zu einem mangelnden Dateinamen führen kann.
Der Grund ist, auf einen internen Anruf in .NET wegen zu prüfen, ob die benutzerdefinierte Encoder .equals(Encoding.UTF8)
ist das nicht wahr ist, es sei denn, true
für die encoderShouldEmitUTF8Identifier wie Encoding.UTF8 geben wird
Die erstellten ZIP-Dateien sind auch von 'fremden' Lesern wie LibreOffice (auch unter Windows) unbrauchbar, da die Backslashes die Spezifikation verletzen. Dies wurde in .NET Foundation behoben - siehe https://github.com/dotnet/corefx/commit/7b9331e89a795c72709aef38898929e74c343dfb. –