论坛首页 Java企业应用论坛

花了一些时间,解决了 zip 中文文件名乱码的问题,供参考

浏览 10742 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-16   最后修改:2009-03-16
在 windows 下进行 zip,然后在 linux 下 unzip,中文的文件名会乱码。
网上一般的解决办法是重新编译 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();
		}
	}
   发表时间:2009-03-16  
把ANT的zip代码看完就知道他是怎么做到的了。
其实JDK犯了个不大不小的错误,在写文件名的时候用UTF-8写死了(具体方法不记得了,反正是个私有的)。
0 请登录后投票
   发表时间:2009-03-17  
难道文件名不是UTF8表示的啊。。。。。。。。。。。
0 请登录后投票
   发表时间:2009-03-17  
sdh5724 写道
难道文件名不是UTF8表示的啊。。。。。。。。。。。


这个和文件名没关系,zip里面没有文件和目录,只有键值对。
只是我们常用的zip解压程序都默认永本地字符集解压或者查看,所以看到基于utf-8做的键就只能乱码现实了。


仍外,jdk自带的zip类好像都直接是原生方法了,如果只是私有还好说,可以永反射跳过权限控制,而原生方法就万全没招了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics