jar.exe的encode问题

在HP-UX 11i系统中使用Java进行FTP文件更新时遇到问题,特别是使用ZIPInputStream解压含有中文字符的文件名时抛出异常。该问题源于Java的一个已知BUG,在不同平台间处理中文文件名时出现错误。

— 作者 wonder @ 05:38

 

 

 

 

说起来我好像和小型机有仇,今天晚上更新程序死活也更新不上去,这个hpux11i真实麻烦。大多数ftp程序都不好用,后来只能用jar打包,打完后把程序放到hpux上用jar解压缩,见鬼,这都能出问题,结果报了一个异常。java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:298),唉咋办,上网查了查,发现居然是sun的一个bug,而且六年都没有改了,TNND,sun你就不能勤快点啊。

没办法,只能试了试,结果发现只要在同一个平台就没有问题,后来估计是平台的encode的问题,不过没找到在什么地方设置。解决办法:在windows下用jar压缩一个jar文件,然后用windows的ftp工具把这个文件传到hpux上,然后再在windows下用telnet工具连接到hpux上,执行jar xvf就好用了。

最后再鄙视一下sun的懒惰!

 

Bug ID:4820807

 
Votes 9
Synopsis java.util.zip.ZipInputStream cannot extract files with Chinese chars in name
Category java:classes_util_jarzip
Reported Against 1.2.1 , 1.4.1 , tiger
Release Fixed  
State In progress, request for enhancement
Related Bugs 4885817 , 4244499
Submit Date 19-FEB-2003
Description
FULL PRODUCT VERSION :
java version "1.4.1"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-b21)
Java HotSpot(TM) Client VM (build 1.4.1-b21, mixed mode)


FULL OPERATING SYSTEM VERSION :
Microsoft Windows 2000 [Version 5.00.2195]
Service Pack 3

A DESCRIPTION OF THE PROBLEM :
If ZipInputStream is used to read a zip file containing one
or more files with Chinese, Japanese or Korean names, the
getNextEntry method throws an IllegalArgumentException.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Create a zip file containing at least one file with a
Chinese, Japanese or Korean filename.
2. Try to read using a ZipInputStream.

EXPECTED VERSUS ACTUAL BEHAVIOR :
Should return a valid entry with the correct filename
instead of throwing an exception.

ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.lang.IllegalArgumentException

    at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:291)

    at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:230)

    at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:75)

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public final class TestCase {
    public static void main(String[] args) throws IOException {
        ZipInputStream zis = new ZipInputStream(new FileInputStream
("myfile.zip"));
        ZipEntry entry;
        while ((entry = zis.getNextEntry()) != null) {
            System.out.println("found " + entry.getName());
        }
    }
}

---------- END SOURCE ----------

CUSTOMER WORKAROUND :
Do not use CJK filenames in zip files.
(Review ID: 181382) 
======================================================================


 xxxxx@xxxxx  2003-09-02

Same problem reported by a CAP member from Germany:

J2SE Version (please include all output from java -version flag):
  java version "1.4.1"
  Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-b21)
  Java HotSpot(TM) Client VM (build 1.4.1-b21, mixed mode)

and

  java version "1.5.0-beta"
  Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b16)
  Java HotSpot(TM) Client VM (build 1.5.0-beta-b16, mixed mode)


Does this problem occur on J2SE 1.3, 1.4 or 1.4.1?  Yes / No (pick one)
  Yes

Operating System Configuration Information (be specific):
  English Linux and German Win2K

Bug Description:
  A ZIP file with entries that contain german umlauts. When read
  read these entries using ZipInputStream.getNextEntry() it throws an 
  IllegalArgumentException at:

Exception in thread "main" java.lang.IllegalArgumentException
         at 
java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:298)
         at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:237)
         at 
java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:73)
         at ZipUmlauts.main(ZipUmlauts.java:22)

  It would be better, if the getUTF8String() method would just ignore 
  these "illegal" characters or add them "as-is".

Test Program: (ZipUmlauts.java umlauts.zip)
-------------

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/*
 *  ZipUmlauts.java created on Sep 1, 2003 8:45:08 AM
 */

/**
 * @version ${Id:}
 * @author rs
 * @since pirobase®CB 1.0
 */
public final class ZipUmlauts {

    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("umlauts.zip");
        ZipInputStream zis=new ZipInputStream(fis);
        ZipEntry ze;
        while ((ze=zis.getNextEntry())!=null) {
            System.out.println(ze.getName());
        }
    }

}
Work Around
N/A
Evaluation
Unfortunately, fixing this in a backward-compatible way may be impossible.
At least, for non-ASCII file names, Java should be able to create files
on one system and extract them on a different system, even if the
encodings are different.

The suggestion of adding an encoding attribute is a good one.
That should have been done when the decision to encode file names
in UTF-8 was first made.
 xxxxx@xxxxx  2003-09-04

I have confirmed that, as long as one uses Sun's J2SE zip
implementation consistently, in a environment where file.encoding
supports the character set of interest,
that one can create, list and extract
jar/zip files containing non-ASCII characters (including Chinese
characters) correctly.   Other zip implementations also have
character encoding interoperability problems, so J2SE's
implementation is not alone.

The suggestion of falling back to file.encoding is an appealing one,
but it's quite dangerous to go down that route.

Encoding "autodetection" is a good interactive feature for users, but
it's not so good for file formats.  To have a file be properly readable
depending fairly randomly on the data bit patterns stored within it
is a reliability disaster.  It's much better to have consistent failure
than intermittent "success".

Re-architecting zip to record the encoding of the file names will
hopefully get done for J2SE 1.6.

 xxxxx@xxxxx  2003-11-25


I believe this is a duplicate of 4244499. See the evaluation of that bug report for a relatively simple proposed solution.
 xxxxx@xxxxx  2005-1-29 00:28:38 GMT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值