最近做项目,遇到在linux系统下解析zip文件提取zip里面文档的文本内容。
现在的问题是:
如果在windows系统下压缩的zip文件,里面含有中文名的文件,到了linux系统下,文件名就是乱码。
用java类库中的zip解析库时,用getNextEntry()根本就的不到该文件,直接报出异常。因为的不到该文件,所以
就不能解析该文件了。听其他同事说可以把名字替换了(他们用的per语言写的)。现在我根本名字都得不到,怎么替换呢。
遇到这个问题怎么解决呢??请各位高手指教下!
现在的问题是:
如果在windows系统下压缩的zip文件,里面含有中文名的文件,到了linux系统下,文件名就是乱码。
用java类库中的zip解析库时,用getNextEntry()根本就的不到该文件,直接报出异常。因为的不到该文件,所以
就不能解析该文件了。听其他同事说可以把名字替换了(他们用的per语言写的)。现在我根本名字都得不到,怎么替换呢。
遇到这个问题怎么解决呢??请各位高手指教下!
total.zip
{
a.txt;
中文.txt;
}即使文件名到linux上面变成乱码,也不会影响getNextEntry()这个的吧。
getNextEntry()在我看来,应该是获得文件名字,然后根据文件的名字来读取文件。
假设获得的文件名字是'áéí',然后程序会根据该名字来找文件,而该名字只是中间变量而已。会不会错误不在这个地方啊?
同时我还试了下,在linux下复制中文乱码文件名,根本就复制不了。复制--粘贴就什么也没有。
Windows一般都是GBK。Linux也改成GBK就行。
这样,windows下的zip文件,你拷贝到linux下,就不会成乱码了。
以后用起来也方便。否则,其他Java程序,也有可能会出现类似的编码问题。
两个系统编码不同的原因,如果把两个系统编码改为相同,可能会OK的.http://hi.baidu.com/sylilzy/blog/item/86935ec6ce03211c9c163d14.html希望高手出马....
不过用了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文件。