最近做项目,遇到在linux系统下解析zip文件提取zip里面文档的文本内容。
现在的问题是:
     如果在windows系统下压缩的zip文件,里面含有中文名的文件,到了linux系统下,文件名就是乱码。
用java类库中的zip解析库时,用getNextEntry()根本就的不到该文件,直接报出异常。因为的不到该文件,所以
就不能解析该文件了。听其他同事说可以把名字替换了(他们用的per语言写的)。现在我根本名字都得不到,怎么替换呢。
遇到这个问题怎么解决呢??请各位高手指教下!

解决方案 »

  1.   

    我这样看:
    total.zip
    {
    a.txt;
    中文.txt;
    }即使文件名到linux上面变成乱码,也不会影响getNextEntry()这个的吧。
    getNextEntry()在我看来,应该是获得文件名字,然后根据文件的名字来读取文件。
    假设获得的文件名字是'áéí',然后程序会根据该名字来找文件,而该名字只是中间变量而已。会不会错误不在这个地方啊?
      

  2.   

    在linux下更改一下字符集编码利用convmv 更改一下文件和目录的编码格式,命令:convmv -f 源编码 -t 新编码 [选项] 文件名如果系统提示没有convmv 的话就安装一个,具体步骤就不说了,方法有了,出现问题就google吧,网上大把教你怎么用。最后别忘记了也顺便更改一下linux下中文编码。省的以后操作的又有乱码。不过不推荐文件名用中文,总是有这样那么的编码问题
      

  3.   

    我每次调试的时候,就在getNextEntry()方法处出错,去查看该zip文件,发现里面就是有中文的乱码。
    同时我还试了下,在linux下复制中文乱码文件名,根本就复制不了。复制--粘贴就什么也没有。
      

  4.   

    应该是更改Linux系统的字符编码就可以搞定了。
    Windows一般都是GBK。Linux也改成GBK就行。
    这样,windows下的zip文件,你拷贝到linux下,就不会成乱码了。
    以后用起来也方便。否则,其他Java程序,也有可能会出现类似的编码问题。
      

  5.   

    压缩与解压编码不同:
    两个系统编码不同的原因,如果把两个系统编码改为相同,可能会OK的.http://hi.baidu.com/sylilzy/blog/item/86935ec6ce03211c9c163d14.html希望高手出马....
      

  6.   

    用JAVA API本来就不支持中文压缩!!你试下用apache的ANT.jar就可以支持中文压缩与中文解压拉!
      

  7.   

    今天终于做起了。
    不过用了ant,当时ant达不到项目要求,所以最终没有用ant
    我这里用的是修改jdk类库ZipInputStream代码。
    方法一:
    这里我把我修改ZipInputStream类的方法写下,大家共同学习。
    1.从jdk的src.zip取得ZipInputStream.java原始码,改名为CZipInputStream.java。 
    2.开始修改原始码,将class名称改为CZipInputStream 
    3.建构式也必须更改为CZipInputStream 
    4.新增member,这个member记录编码方式 
      private String encoding="UTF-8"; 
    5.再新增一个建构式如下(这个建构式可以让这个class在new的时候,设定档名的编码) 
    public CZipInputStream(InputStream in,String encoding) { 
      super(new PushbackInputStream(in,512),new Inflater(true),512); 
      usesDefaultInflater = true; 
      if(in == null) { 
           throw new NullPointerException("Stream is null"); 
      } 
      this.encoding=encoding; 

    6.找到ZipEntry e = createZipEntry(getUTF8String(b, 0, len));这一行,将它改成如下: 
    ZipEntry e=null; 
    try 

      if (this.encoding.toUpperCase().equals("UTF-8")) 
         e=createZipEntry(getUTF8String(b, 0, len)); 
      else 
         e=createZipEntry(new String(b,0,len,this.encoding)); 

    catch(Exception byteE) 

      e=createZipEntry(getUTF8String(b, 0, len)); 

    方法二、
    修改ZipInputStream
    ZipInputStream这个类中,需要修改getUTF8String这个方法,经过试验,用winRar压缩后的zip文件,其中的中文文件名是以gbk编码保存的,因此只需要在这个方法的前面加上
    try {
       String s = new String(b,off,len,"gbk");
       return s;
      } catch (UnsupportedEncodingException e) {
       e.printStackTrace();
      }
    修改后的方法类似下面的代码:
    private static String getUTF8String(byte[] b, int off, int len) {
      try {
       String s = new String(b,off,len,"gbk");
       return s;
      } catch (UnsupportedEncodingException e) {
       e.printStackTrace();
      }
      // First, count the number of characters in the sequence
      int count = 0;
      int max = off + len;
    }
    这两个方法原理是一样的。不过第一种好些,能够制定编码方式。
     
    经测试,能够解决zip在windows下压缩,到linux下出现中文名乱码的情况。
    同时我也测试了,这样改后,也能够正常解析,Linux下压缩的zip文件。