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;
}
问题就解决了。
压缩代码非常简单如下:
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;
}
问题就解决了。
相关文章推荐
- jquery的ajax()函数中文传值出现乱码完美解决方案
- Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(比较巧妙,toLatin1压缩掉了QString自动给每个英文字符加上的那些00字节)
- JSP页面出现中文乱码的两种解决方案
- HtmlAgilityPack 加载中文页面时出现在乱码的最终解决方案
- java 下载文件时中文出现乱码解决方案
- MultipartEntity上传文件时传递中文参数出现乱码的解决方案
- 关于servlet向mysql写数据时出现中文乱码的解决方案
- 在html页面提交值到动态页面时出现中文值为乱码的解决方案
- Java文件名包含中文的文件压缩后文件名乱码问题,完美解决方案
- ACTIVITI在LINUX下查看流程图片中文字体出现乱码的解决方案
- 在SQL 2005中用T-SQL插入中文数据时出现的问号或乱码的解决方案
- C#操作MySQL时,出现的中文乱码的解决方案
- JQuery AJAX提交中文出现乱码的解决方案
- 在CMD中操作mysql数据库出现中文乱码解决方案
- jquery+jsp+servlet做$.ajax交互时出现中文乱码(字符集问题)的解决方案
- jsp页面中内部的js弹出中文出现乱码解决方案
- FIREFOX 下载中文文件名出现乱码的java解决方案
- 用StreamReader读取中文出现乱码的解决方案
- 使用myeclipse插入数据到mysql 出现中文乱码|utf8乱码解决方案[适合tomcat部署的jsp应用]
- was7中文redhat6上安装出现中文乱码解决方案