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

由于项目的需要本人需要做一个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;
            }

问题就解决了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值