2012-12-20 57 views
6

在我的網站上,我可以選擇下載用戶上傳的所有圖像。問題是在圖像與希伯來文名稱(我需要文件的原始名稱)。我試圖解碼文件名,但這沒有幫助。下面是一個代碼:UTF-8文件名的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 哪裏是我的錯?

+0

什麼是新的ZipEntry?我不知道這是新的'System.IO.Compression'命名空間的一部分。 J#? – efkah

+0

這是ICSharpCode.SharpZipLib.Zip庫 –

回答

1

Unicode(UTF-8是二進制編碼之一)可以表示比其他8位編碼更多的字符。而且,你沒有做適當的轉換,而是重新解釋,這意味着你的文件名會被垃圾篡改。你應該真的閱讀Joel on Unicode的文章。

...

現在您已經閱讀這篇文章,你應該知道,在C#字符串可以存儲Unicode數據,所以你可能不需要做任何file.Name轉換和可以直接通過這個到ZipEntry構造函數如果庫不包含編碼處理錯誤(這總是可能的)。

+0

嗨。感謝您的回覆和文章。如果我不執行編碼塊,我的zip文件名就像這樣:' –

0

你正在做錯誤的轉換,因爲C#中的字符串已經是unicode。 你用什麼工具檢查檔案中的文件名? 默認情況下,Windows ZIP實現使用系統DOS編碼作爲文件名,而其他實現可以使用其他編碼。