您的位置:首页 > 其它

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

2010-05-26 20:13 316 查看
由于项目的需要本人需要做一个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;
}

问题就解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: