在 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