2012-12-20 2 views
6

In meiner Website habe ich die Option, alle Bilder von Benutzern hochgeladen herunterladen. Das Problem ist in Bildern mit hebräischen Namen (ich brauche den ursprünglichen Namen der Datei). Ich habe versucht, Dateinamen zu dekodieren, aber das hilft nicht. Hier ist ein Code:Zip-Datei mit utf-8 Dateinamen

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); 
    } 
} 

Nach utf-8-Kodierung i hebräisch Dateinamen wie diese:. ?????? jpg Wo ist mein Fehler?

+0

Was ist ein neuer 'ZipEntry'? Ich bin mir nicht bewusst, dass dies Teil des neuen 'System.IO.Compression'-Namespace ist. j #? – efkah

+0

Dies ist ICSharpCode.SharpZipLib.Zip-Bibliothek –

Antwort

1

Unicode (UTF-8 ist eine der binären Codierung) kann mehr Zeichen als die anderen 8-Bit-Codierung darstellen. Darüber hinaus führen Sie keine korrekte Konvertierung, sondern eine Neuinterpretation durch, was bedeutet, dass Sie für Ihre Dateinamen einen "Müll" erhalten. Sie sollten wirklich den Artikel von Joel on Unicode lesen.

...

Jetzt, wo Sie den Artikel gelesen haben, sollten Sie wissen, dass in C# String Unicode-Daten speichern können, so dass Sie wahrscheinlich jede Umwandlung von file.Name nicht tun müssen, und diese direkt weitergeben können zu ZipEntry Konstruktor, wenn die Bibliothek keine Bugs zur Codierung enthält (dies ist immer möglich).

+0

Hallo. Danke für die Antwort und für den Artikel. Wenn ich den Kodierungsblock nicht ausführe, habe ich Dateinamen in meiner Zip wie folgt: ëàààëëò Çàîé_1.jpg –

0

Sie führen eine falsche Konvertierung durch, da Zeichenfolgen in C# bereits Unicode sind. Mit welchen Tools überprüfen Sie die Dateinamen im Archiv? Standardmäßig verwenden Windows-ZIP-Implementierungen System-DOS-Codierung für Dateinamen, während andere Implementierungen andere Codierung verwenden können.