在 windows 下进行 zip,然后在 linux 下 unzip,中文的文件名会乱码。
网上一般的解决办法是重新编译 unzip 来绕过去。
我查了一下,可以通过 entry.setUnixMode 的方式,将 platform 设置为 Unix,如下:
这样在解压的时候,就不需要绕过去了。
另外:要使用 ant 的 zip class,才能解决中文文件名乱码问题,JDK默认的我暂时还不知道如何做。
网上一般的解决办法是重新编译 unzip 来绕过去。
我查了一下,可以通过 entry.setUnixMode 的方式,将 platform 设置为 Unix,如下:
- public void setUnixMode(int mode) {
- // CheckStyle:MagicNumberCheck OFF - no point
- setExternalAttributes((mode << 16)
- // MS-DOS read-only attribute
- | ((mode & 0200) == 0 ? 1 : 0)
- // MS-DOS directory flag
- | (isDirectory() ? 0x10 : 0));
- // CheckStyle:MagicNumberCheck ON
- platform = PLATFORM_UNIX;
- }
这样在解压的时候,就不需要绕过去了。
另外:要使用 ant 的 zip class,才能解决中文文件名乱码问题,JDK默认的我暂时还不知道如何做。
- import org.apache.tools.zip.ZipEntry;
- import org.apache.tools.zip.ZipOutputStream;
- public static void write(File path, File zipFile) throws IOException {
- ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipFile));
- zip.setEncoding("GBK");
- Util.write(path, path, zip);
- zip.close();
- }
- private static void write(File base, File path, ZipOutputStream zip) throws IOException {
- URI rel = base.toURI().relativize(path.toURI());
- if (path.isDirectory()) {
- ZipEntry entry = new ZipEntry(rel.getPath());
- entry.setUnixMode(755);
- zip.putNextEntry(entry);
- zip.closeEntry();
- File[] files = path.listFiles();
- for (File file : files) {
- write(base, file, zip);
- }
- } else {
- ZipEntry entry = new ZipEntry(rel.getPath());
- entry.setUnixMode(644);
- zip.putNextEntry(entry);
- FileInputStream is = new FileInputStream(path);
- zip.write(IOUtils.toByteArray(is));
- is.close();
- zip.closeEntry();
- }
- }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
方法二:通过修改输出流
编码方法 out.setEncoding("gbk");
有待验证
推荐链接http://www.iteye.com/topic/349790
1:再压缩前,要设置linux模式, 需要使用第三方ant-1.6.5.jar
如果是文件目录,则
ZipEntry zipEntry=new ZipEntry(basePath + System.getProperties().getProperty("file.separator"));
zipEntry.setUnixMode(755);//解决linux乱码
如果是文件,则
ZipEntry zipEntry=new ZipEntry(base);
zipEntry.setUnixMode(644);//解决linux乱码
然后在输出时强制设置编码:
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFileName));
out.setEncoding("GBK");//解决linux乱码
全部代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Expand;
/**
* 文件夹压缩,支持win和linux
* @author wlzhang
*
*/
public class ZipUtil
{
/**
* @param inputFileName
* 输入一个文件夹
* @param zipFileName
* 输出一个压缩文件夹,打包后文件名字
* @throws Exception
*/
public static OutputStream zip(String inputFileName, String zipFileName) throws Exception
{
return zip(zipFileName, new File(inputFileName));
}
private static OutputStream zip(String zipFileName, File inputFile) throws Exception
{
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFileName));
out.setEncoding("UTF-8");//解决linux乱码 根据linux系统的实际编码设置,可以使用命令 vi/etc/sysconfig/i18n 查看linux的系统编码
zip(out, inputFile, "");
out.close();
return out;
}
private static void zip(ZipOutputStream out, File f, String base) throws Exception
{
if (f.isDirectory())
{ // 判断是否为目录
File[] fl = f.listFiles();
// out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));
// out.putNextEntry(new ZipEntry(base + "/"));
ZipEntry zipEntry=new ZipEntry(base + System.getProperties().getProperty("file.separator"));
zipEntry.setUnixMode(755);//解决linux乱码
out.putNextEntry(zipEntry);
// base = base.length() == 0 ? "" : base + "/";
base = base.length() == 0 ? "" : base + System.getProperties().getProperty("file.separator");
for (int i = 0; i < fl.length; i++)
{
zip(out, fl[i], base + fl[i].getName());
}
}
else
{ // 压缩目录中的所有文件
// out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));
ZipEntry zipEntry=new ZipEntry(base);
zipEntry.setUnixMode(644);//解决linux乱码
out.putNextEntry(zipEntry);
FileInputStream in = new FileInputStream(f);
int b;
while ((b = in.read()) != -1)
{
out.write(b);
}
in.close();
}
}
private static void unzip(String sourceZip,String destDir) throws Exception{
try{
Project p = new Project();
Expand e = new Expand();
e.setProject(p);
e.setSrc(new File(sourceZip));
e.setOverwrite(false);
e.setDest(new File(destDir));
/*
ant下的zip工具默认压缩编码为UTF-8编码,
而winRAR软件压缩是用的windows默认的GBK或者GB2312编码
所以解压缩时要制定编码格式
*/
e.setEncoding("UTF-8"); //根据linux系统的实际编码设置
e.execute();
}catch(Exception e){
throw e;
}
}
} http://www.oschina.net/code/snippet_250494_10312
本文介绍了解决Windows下压缩、Linux下解压时出现的中文文件名乱码问题的方法。通过设置Unix模式和输出流编码,确保了文件名在不同平台间的正确显示。

2102

被折叠的 条评论
为什么被折叠?



