`
javadonkey
  • 浏览: 110498 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java解zip文件 字符集问题

    博客分类:
  • java
阅读更多
昨天部署系统到linux上,系统里有个java解压用户上传的zip包的功能。在windows上运行没有问题,可到了linux上如果zip包里包含中文名的文件传上去后文件名就是乱码。就这个问题我和我的小师傅(一个教了我不少东西的朋友 )足足搞了半宿。差点疯掉!!先前以为可能是linux是英文的缘故!!后把linux改成了中文的,可是还是不行。后来在解压那段代码上加了debug输出,打印了一下zip包里的文件名,后发现到这文件名已经是乱码了!!在 google 上找了找!发现出这样问题的还真不少总结了一下大多数的解决方法都是这样的

引用

  1. 使用zip文件包内带有中文文件名文件测试,失败.后google发现java.util.zip未处理文件名编码问题已经是陈年问题。有建议说用apache 的ant.jar ver1.7中的 org.apache.tools.zip 替换java.util.zip可以解决此问题。 在命令行上测试果然成功。
  2. 问题接踵而至,由于是在一个比较老的系统上(tomcat 4.1.12 and jdk1.4.0)做一个新增的小功能,在tomcat4.1.12上已经有一个ant.jar .如替换此ant.jar .会造成tomcat出现500错。而在新的Apache Tomcat 4.1.36-LE-jdk14 Server 上就没有问题。为了保持兼容性。这个新版本ant.jar(Ver1.7)是不能用了。看了一下org.apache.tools.zip的源码,只好把这个zip package摘出来,单独编译为一个package。比如叫com.mytest.common.apachezip. 然后,在tomcat 4.1.12中import这个package,不使用和tomcat的ant冲突的apache ant.jar(ver 1.7)。问题得以解决。

我们按照上面说的方法把ant的zip package摘出来,放到自己的工程里(apache就是牛,包结构分的特好,把这个包拿出来后都不需要在引其它包)。然后把解zip包的相关类改为自己导出来的类。这样在部上发现还是不行!看样和上面出的问题不是一回事!!真想吐!!都不知道该骂谁好!!(呵呵,骂人是不对的)
最后我们在本地做了个小实验

public class Keck {

	public static void main(String[] args) throws UnsupportedEncodingException {
		
		System.out.println(new String("粥一生".getBytes(), "UTF-8"));
	}
}

控制台打印出和在linux下一样的“?????”。后又换成了GBK

public class Keck {

	public static void main(String[] args) throws UnsupportedEncodingException {
		
		System.out.println(new String("粥一生".getBytes(), "GBK"));
	}
}

这回打印出了正确的“粥一生”。接着我们把解压的字符集显示的设为GBK

 ZipFile zipFile = new ZipFile(zipFileName, "GBK");

部署到linux上,访问O了!!这下终于明白是怎么回事了。有点爽的感觉,但还是为这事有点恶。(“跨平台相当好是java的卖点”!! 哎.....)

问题分析

[list]
  • linux默认字符集是 "UTF-8"
  • windows默认字符集是 "GBK"
  • [*]
    ZipFile zipFile = new ZipFile(zipFileName);

    这样创建ZipFile对象的话,解压时会取本地系统的字符集生成文件名字符串。这样在windows下压的zip文件到linux下解压就会出现乱码问题。所以要像上面一样创建对像时指定字符集。
  • 但像上面那样做也不是很O!!试一下,在linux创建的zip文件在这样上传也会出乱码问题。在windows上压的zip文件要用 "GBK"解压,可在在linux上压的zip文件要用 "UTF-8" 解压,这个问题现在还没想到怎么解决,如果哪们人兄有办法希望能说说。
  • [/list]
    分享到:
    评论
    1 楼 spiritfrog 2008-07-10  

    用什么编码打包的,就要用什么编码解包。

    相关推荐

      java文件字符编码集判断依赖.zip

      通用的文件字符编码集判断需要借助第三方包cpdetector.jar 使用Cpdetector jar包检测文件编码需要依赖antlr-2.7.7.jar、chardet-1.0.jar、jargs-1.0.jar三个jar包 本下载资源一站式全包含,并附带亲测有效的片段...

      如何使用Java代码获取文件、文件流或字符串的编码方式.zip

      本工程用于研究如何使用Java代码获取文件、文件流或字符串的编码方式 本工程编码方式:UTF-8 开发工具:MyEclipse 参考博客:http://blog.csdn.net/gaohuanjie/article/details/43735891

      Java ZIP压缩一个或多个文件(解决中文名称乱码).rar

      用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。

      java源码包---java 源码 大量 实例

       Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

      JAVA上百实例源码以及开源项目

       Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

      simhash算法的java实现simhash-java.zip

      特点计算字符串的 simhash通过构建智能索引来计算所有字符串之间的相似性,因此可以处理大数据使用使用输入文件和输出文件运行 Maininputfile 的格式(参见 src / test_in):一个文件每行用 utf8 字符集outputfile...

      JAVA上百实例源码以及开源项目源代码

       Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

      java源码包4

       Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

      java源码包3

       Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

      java源码包2

       Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

      Java案例开发锦集

      mail 案例5 从Mail Server删除一条消息 案例6 在Java程序中实现FTP的功能 案例7 一个最简单的聊天程序 案例8 代理服务器的实现 第十章 Java综合实例 案例1 用Java实现zip压缩解压缩 ...

      成百上千个Java 源码DEMO 4(1-4是独立压缩包)

      Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看 Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码...

      Bruteforce:一个用 Java 编写的暴力密码破解器,用 svn2git 从 svn repo 转换而来

      蛮力一个用 Java 编写的暴力密码破解程序,从 svn repo 转换而来,使用 svn2git。 由于时间限制,它只是部分完成。 它通过命令行或交互模式 (-i) 接受以下参数。 -bf 使用暴力破解密码-zip 破解加密的zip文件文件名...

      Java开发详解.zip

      032004_【第20章:Java新IO】_字符集笔记.pdf 032005_【第20章:Java新IO】_Selector笔记.pdf 042101_【课程讲解】_附录:Eclipse开发工具笔记.pdf 050101_〖开发实例〗_Java开发实例讲解(人员管理)笔记.pdf

      java开源包11

      Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

      java开源包6

      Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

      java开源包9

      Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

      java开源包4

      Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

      java开源包101

      Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

      java开源包5

      Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    Global site tag (gtag.js) - Google Analytics