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;
}
问题就解决了。
- SharpZipLib在压缩成Tar.Gz时出现的中文乱码解决方案
- 在Windows下压缩成tar.gz格式的方法
- 在Windows下压缩生成tar.gz文件的方法
- ICSharpCode.SharpZipLib生成tar、tar.gz
- ICSharpCode.SharpZipLib生成tar、tar.gz
- ICSharpCode.SharpZipLib生成tar、tar.gz
- 在git中出现中文乱码的解决方案
- linux把文件压缩成.tar.gz的命令
- linux下把文件夹压缩成tar.gz的命令
- linux把文件压缩成.tar.gz的命令
- linux把文件压缩成.tar.gz的命令
- 把linux文件夹压缩成tar.gz的命令
- 把linux文件夹压缩成tar.gz的命令
- linux把文件压缩成.tar.gz的命令
- tgz(tar.gz)的压缩和解压
- WINDOWS下压缩tar.gz 的方法
- tgz(tar.gz)的压缩和解压
- tgz(tar.gz)的压缩和解压
- SQLite数据库连接方式
- Java异常框架设计
- 启动ubuntu时显示mount file system failed的解决方法
- 敏捷开发4句宣言
- 使用软件虚拟串口
- SharpZipLib在压缩成Tar.Gz时出现的中文乱码解决方案
- 国家会议中心:参加百度【框广天下,搜赢未来】推广会议
- new二维数组的几种方法
- Xen添加hypercall获取page_fault次数
- SSH PROGRAMMING WITH PARAMIKO | COMPLETELY DIFFERENT | 另类方法?
- 分析内存的好文章http://translate.google.com.hk/translate?hl=zh-CN&langpair=en%7Czh-CN&u=http://www.vogella.de/articles/JavaPerformance/a
- 以下代码在执行的时候,有时会打印出5行甚至6行输出,为什么?(VC6.0)
- 《认清C++语言》之--内存管理
- 用SQL语句拼接数据库表中一列的数据