本站首页    管理页面    写新日志    退出


«July 2020»
1234
567891011
12131415161718
19202122232425
262728293031


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7228505
建立时间:2006年5月29日




[Java代码]Java中压缩与解压--中文文件名乱码解决办法
软件技术

lhwork 发表于 2008-4-2 21:30:15

java对於文字的编码是以 unicode为基础,因此,若是以ZipInputStream及ZipOutputStream来处理压缩及解压缩的工作,碰到中文档名或路径,那当然是以unicode来处理罗!但是,现在市面上的压缩及解压缩软体,例如winzip,却是不支援unicode的,一碰到档名以unicode编码的档案,它就不处理。 那要如何才能做出让WinRar能够处理的压缩档呢?那就得从修改ZipInputStream及ZipOutputStream对於档名的编码方式来着手了。我们可以从jdk的src.zip取得ZipInputStream及ZipOutputStream的原始码来加以修改一、ZipOutputStream.java1.从jdk的src.zip取得ZipOutputStream.java原始码,另存到一个新文件中,档名改为CnZipOutputStream.java。2.开始修改原始码,将class名称改为CnZipOutputStream3.建构式也必须更改为CnZipOutputStream4.新增member,这个member记录编码方式  private String encoding="UTF-8";5.再新增一个建构式(这个建构式可以让这个class在new的时候,设定档名的编码)  public CZipOutputStream(OutputStream out,String encoding) {     this(out);     this.encoding=encoding;  }6.找到byte[] nameBytes = getUTF8Bytes(e.name);(有二个地方),将它修改如下: byte[] nameBytes = null;  try  {  if (this.encoding.toUpperCase().equals("UTF-8"))  nameBytes =getUTF8Bytes(e.name);  else  nameBytes= e.name.getBytes(this.encoding);  }  catch(Exception byteE)  {  nameBytes=getUTF8Bytes(e.name);  }二、ZipInputStream.java1.从jdk的src.zip取得ZipInputStream.java原始码,另存到一个新文件中,档名改为CnZipInputStream.java。2.开始修改原始码,将class名称改为CnZipInputStream3.建构式也必须更改为CnZipInputStream4.新增member,这个member记录编码方式  private String encoding="UTF-8";5.再新增一个建构式如下(这个建构式可以让这个class在new的时候,设定档名的编码)public CZipInputStream(InputStream in,String encoding) {  this(in);  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));  }以上两个档案储存後compile产生CZipOutputStream.class及CZipInputStream.class,使用winzip开启 [java_home]\jre\lib\rt.jar这个档案,将CnZipOutputStream.class及 CnZipInputStream.class加进去,以後当压缩及解压缩时有中文档名及路径的问题时,就可以指定编码方式来处理了。使用方法:CnZipOutputStream zos=new CnZipOutputStream(OutputStream os,String encoding);CnZipInputStream zins=new CnZipInputStream(InputStream ins,String encoding);对于前面文章中文件打包下载中遇到的中文文件问题,解决手法是:OutputStream os = response.getOutputStream();CnZipOutputStream zos = new CnZipOutputStream(os,"gbk"); //加上中文编码类型


阅读全文(32613) | 回复(8) | 编辑 | 精华
 


回复:Java中压缩与解压--中文文件名乱码解决办法
软件技术

122(游客)发表评论于2013-4-10 16:09:29

feichangganxie


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


Replica Watches
软件技术

Replica Watches(游客)发表评论于2010-4-29 10:35:17

yangyiyi100429 Replica Watches Replica Rolex watches Cartier Replica Watches Replica Sunglasses Gucci Sunglasses Dior Sunglasses Rolex replica Watches Replica Scarf

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:Java中压缩与解压--中文文件名乱码解决办法
软件技术

 3466(游客)发表评论于2010-3-1 16:35:22

黄山温泉 黄山旅游 合肥贷款公司 水处理 位移传感器 液体壁纸 三亚家庭旅馆 电子商务解决方案 LED日光灯 数据恢复

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:Java中压缩与解压--中文文件名乱码解决办法
软件技术

包坤涛(游客)发表评论于2009-8-20 12:40:16

ZipOutputStream 对象 的 setEncoding("gbk"); 方法就好了

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:Java中压缩与解压--中文文件名乱码解决办法
软件技术

wowgold(游客)发表评论于2008-12-10 9:22:06

还不是很明白

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:Java中压缩与解压--中文文件名乱码解决办法
软件技术

过路的(游客)发表评论于2008-11-6 9:20:02

这个方法很糟糕,修改了JDK本身,除了高手自己在家用没别的实用价值。你本来可以做一个FilterInputStream,放在ZipInputStream的前面,把zip文件里的GBK名字改成UTF-8的。稍微看看zip规范就是了。

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:Java中压缩与解压--中文文件名乱码解决办法
软件技术

Nova(游客)发表评论于2008-10-27 19:04:03

谢谢

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.063 second(s), page refreshed 144422290 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号