DotNetZip解決檔名稱中文字元不顯示的問題

iDotNetSpace發表於2009-10-22

由於工作需要,從網上下載了一個壓縮元件--DotNetZip,使用感覺良好,但是目錄中有中文名稱的檔案時,就會出現問題,要麼名稱顯示不全,要麼就顯示若干個問號,很是令人苦惱!!

    沒辦法,只好自己動手解決問題啦,一步步的跟蹤定位,最後找到ZipEntry類的WriterHeader方法,估計是寫檔案頭,檔名稱應當寫在這裡,經過除錯,發現這一行:

DotNetZip解決檔名稱中文字元不顯示的問題
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtDotNetZip解決檔名稱中文字元不顯示的問題/////////////////////////////////替換內容
byte[] x = System.Text.Encoding.GetEncoding("GB2312").GetBytes(FileName);
Int16 filenameLength 
= (Int16)x.Length;
DotNetZip解決檔名稱中文字元不顯示的問題
////////////////////////////////被替換內容
// filename length (Int16)
//Int16 filenameLength = (Int16)FileName.Length;
DotNetZip解決檔名稱中文字元不顯示的問題
////////////////////////////////
FileName.Length不論遇到一個漢字還是一個字母數字,都是返回1,而一個漢字卻佔兩個位元組,可能問題出在這兒,再進一步地跟蹤,果然發現問題

 

DotNetZip解決檔名稱中文字元不顯示的問題
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt 1DotNetZip解決檔名稱中文字元不顯示的問題/////////////////////////替換內容
 2for (j = 0; (j < x.Length) && (i + j < bytes.Length); j++)
 3DotNetZip解決檔名稱中文字元不顯示的問題{
 4    bytes[i + j] = x[j];
 5    if (_Debug) System.Console.Write(" {0:X2}", bytes[i + j]);
 6}

 7if (_Debug) System.Console.WriteLine();
 8
 9DotNetZip解決檔名稱中文字元不顯示的問題////////////////////////被替換內容
10
11//for (j = 0; (j 12//{
13//    bytes[i + j] = System.BitConverter.GetBytes(c[j])[0];
14//    if (_Debug) System.Console.Write(" {0:X2}", bytes[i + j]);
15//}
16//if (_Debug) System.Console.WriteLine();
17DotNetZip解決檔名稱中文字元不顯示的問題////////////////////////

程式大意是將檔名稱轉換為字元陣列,再將字元陣列壓縮為位元組陣列,而一個字元中只有一個漢字,壓縮完之後只有一個位元組,而一個位元組是無法表示漢字的,所以,我先採用GetBytes直接生成位元組陣列,獲得字串的真實長度[即漢字為2,字母數字為1],然後將位元組陣列逐個拷至目的位元組陣列,編譯執行,中文名稱果然順利顯示出來了!!!

 問題好象是解決了,可是當解壓時,卻傻眼了,都是些亂碼.不過有了上次的除錯經驗,不需要辛苦跟蹤了,知道問題出在讀Header的地方,果然在ZipEntry類中,ReadHeader方法,設斷點,除錯,最後定位於Shared類中的StringFromBuffer方法

DotNetZip解決檔名稱中文字元不顯示的問題
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt 1DotNetZip解決檔名稱中文字元不顯示的問題/////////////////////////替換內容
 2string str2 = System.Text.Encoding.GetEncoding("GB2312").GetString(buf, start, maxlength);
 3return str2;
 4
 5DotNetZip解決檔名稱中文字元不顯示的問題////////////////////////被替換內容
 6//int i;
 7//char[] c = new char[maxlength];
 8//for (i = 0; (i  9//{
10//    c[i] = (char)buf[i]; // System.BitConverter.ToChar(buf, start+i*2);
11//}
12//string s = new System.String(c, 0, i);
13//return s;
14DotNetZip解決檔名稱中文字元不顯示的問題//////////////////////// 

這個方法大意是,將位元組陣列逐個轉換為字元陣列,將漢字的編碼拆成兩個字元,這很明顯會造成亂碼,既然編碼採用GetBytes,那麼解碼也就用反的,GetString就行了,編譯執行,大功告成!!
原始碼下載:http://files.cnblogs.com/redleaf1995/DotNetZip.rar


原文地址:http://www.cnblogs.com/redleaf1995/archive/2009/10/22/1587908.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-617182/,如需轉載,請註明出處,否則將追究法律責任。

相關文章