linux下java解析zip流里的中文名文件

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

请各位高手指教下!
...全文
479 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦科 2009-06-15
  • 打赏
  • 举报
回复
呵呵
都给点哈!
梦科 2009-06-15
  • 打赏
  • 举报
回复
今天终于做起了。
不过用了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文件。

valen_jia 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Looking_Glass 的回复:]
用JAVA API本来就不支持中文压缩!!你试下用apache的ANT.jar就可以支持中文压缩与中文解压拉!
[/Quote]
kokobox 2009-06-13
  • 打赏
  • 举报
回复
在linux下更改一下字符集编码

利用convmv 更改一下文件和目录的编码格式,

命令:convmv -f 源编码 -t 新编码 [选项] 文件名

如果系统提示没有convmv 的话就安装一个,具体步骤就不说了,方法有了,出现问题就google吧,网上大把教你怎么用。

最后别忘记了也顺便更改一下linux下中文编码。省的以后操作的又有乱码。



不过不推荐文件名用中文,总是有这样那么的编码问题

yztommyhc 2009-06-13
  • 打赏
  • 举报
回复
我这样看:
total.zip
{
a.txt;
中文.txt;
}

即使文件名到linux上面变成乱码,也不会影响getNextEntry()这个的吧。
getNextEntry()在我看来,应该是获得文件名字,然后根据文件的名字来读取文件。
假设获得的文件名字是'áéí',然后程序会根据该名字来找文件,而该名字只是中间变量而已。

会不会错误不在这个地方啊?
zhongxiutao123 2009-06-13
  • 打赏
  • 举报
回复
期待高手解答 up
qusic 2009-06-13
  • 打赏
  • 举报
回复
文件的编码不同吧,你读取的时候默认的文件编码不同。
毕竟是两个操作系统。
luckygino 2009-06-13
  • 打赏
  • 举报
回复
期待高手解答 up
Looking_Glass 2009-06-13
  • 打赏
  • 举报
回复
用JAVA API本来就不支持中文压缩!!你试下用apache的ANT.jar就可以支持中文压缩与中文解压拉!
wenjjing2lianee 2009-06-13
  • 打赏
  • 举报
回复
压缩与解压编码不同:
两个系统编码不同的原因,如果把两个系统编码改为相同,可能会OK的.

http://hi.baidu.com/sylilzy/blog/item/86935ec6ce03211c9c163d14.html

希望高手出马....
冰思雨 2009-06-13
  • 打赏
  • 举报
回复
应该是更改Linux系统的字符编码就可以搞定了。
Windows一般都是GBK。Linux也改成GBK就行。
这样,windows下的zip文件,你拷贝到linux下,就不会成乱码了。
以后用起来也方便。否则,其他Java程序,也有可能会出现类似的编码问题。
梦科 2009-06-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yztommyhc 的回复:]
我这样看:
total.zip
{
a.txt;
中文.txt;
}

即使文件名到linux上面变成乱码,也不会影响getNextEntry()这个的吧。
getNextEntry()在我看来,应该是获得文件名字,然后根据文件的名字来读取文件。
假设获得的文件名字是'áéí',然后程序会根据该名字来找文件,而该名字只是中间变量而已。

会不会错误不在这个地方啊?
[/Quote]

我这是在做项目,做好了是要买给客户用的。人家要用中文命名文件名。我也没办法啊。
这个软件就是要提取所有文档中的文本内容的。
梦科 2009-06-13
  • 打赏
  • 举报
回复
我每次调试的时候,就在getNextEntry()方法处出错,去查看该zip文件,发现里面就是有中文的乱码。
同时我还试了下,在linux下复制中文乱码文件名,根本就复制不了。复制--粘贴就什么也没有。

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧