SharpZipLib在压缩成Tar.Gz时出现的中文乱码解决方案

来源:互联网 发布:毕业设计代做网站java 编辑:程序博客网 时间:2024/05/16 05:17

由于项目的需要本人需要做一个tar.get的打包文件。在网上搜索了一下发现有一个sharpziplib比较符合本人的项目。因为是开源的代码,所以讲其源码一起下载,用vs2005进行编译。

压缩代码非常简单如下:

      Stream stmout = new FileStream(strFilePath, FileMode.OpenOrCreate);
            TarArchive TA = TarArchive.CreateOutputTarArchive(stmout);
            TA.AsciiTranslate =false;                     
            for (int i = 0; i < lvFiles.Items.Count; i++)
            {
                string strfile = lvFiles.Items[i].SubItems[2].Text;
                string strName = lvFiles.Items[i].SubItems[0].Text;               
                TarEntry TE = TarEntry.CreateEntryFromFile(strfile);
                TA.WriteEntry(TE, true);
            }
            TA.CloseArchive();
            stmout.Close();

以上代码可以完成多个文件组成一个tar.get的文件。

在选择文件的时候不小心使用了带有中文的文件名,经过打包以后然后用winrar打开一看,发现中文的文件名编程了乱码。看来这个开源库只有支持ASCII而不支持中文,于是乎,打开源码发现TarHeader.cs中的一段代码897行,解析文件名的时候出现问题。

      //int i;
   
            //for (i = 0 ; i < length - 1 && nameOffset + i < name.Length; ++i) {
            //    buffer[bufferOffset + i] = (byte)name[nameOffset + i];
            //}
   
            //for (; i < length ; ++i) {
            //    buffer[bufferOffset + i] = 0;
            //}

name是一个string类型。name.length只返回的是字符串的个数,如果采用byte转换则把中文的另外一个字节给去掉了(中文字是有两个直接组成的)

把他们修改为一下。

  int i;
            byte[] bytes = System.Text.Encoding.Default.GetBytes(name);
            for (i = 0; i < length - 1 && nameOffset + i < bytes.Length; ++i)
            {
                buffer[bufferOffset + i] = (byte)bytes[nameOffset + i];
            }

            for (; i < length; ++i)
            {
                buffer[bufferOffset + i] = 0;
            }

问题就解决了。

 

原创粉丝点击