昨天部署系统到linux上,系统里有个java解压用户上传的zip包的功能。在windows上运行没有问题,可到了linux上如果zip包里包含中文名的文件传上去后文件名就是乱码。就这个问题我和我的小师傅(一个教了我不少东西的朋友

)足足搞了半宿。差点疯掉!!先前以为可能是linux是英文的缘故!!后把linux改成了中文的,可是还是不行。后来在解压那段代码上加了debug输出,打印了一下zip包里的文件名,后发现到这文件名已经是乱码了!!在 google 上找了找!发现出这样问题的还真不少总结了一下大多数的解决方法都是这样的
引用
- 使用zip文件包内带有中文文件名文件测试,失败.后google发现java.util.zip未处理文件名编码问题已经是陈年问题。有建议说用apache 的ant.jar ver1.7中的 org.apache.tools.zip 替换java.util.zip可以解决此问题。 在命令行上测试果然成功。
- 问题接踵而至,由于是在一个比较老的系统上(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]
分享到:
相关推荐
在Java中,`java.util.zip`包提供了对ZIP文件的基本操作,但默认使用的是平台默认的字符集,这可能在跨平台操作时引发乱码问题。 为了解决这个中文乱码问题,我们需要在创建ZipEntry时指定合适的字符集,通常是UTF-...
通用的文件字符编码集判断需要借助第三方包cpdetector.jar 使用Cpdetector jar包检测文件编码需要依赖antlr-2.7.7.jar、chardet-1.0.jar、jargs-1.0.jar三个jar包 本下载资源一站式全包含,并附带亲测有效的片段...
然而,当压缩文件包含中文字符时,解压缩过程中可能会遇到乱码问题。这是因为编码格式不匹配或者处理方式不当导致的。本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 ...
本工程用于研究如何使用Java代码获取文件、文件流或字符串的编码方式 本工程编码方式:UTF-8 开发工具:MyEclipse 参考博客:http://blog.csdn.net/gaohuanjie/article/details/43735891
在Java编程环境中,处理压缩和解压缩文件是一项常见的任务,特别是在需要打包或传输大量数据时。本篇文章将详细探讨如何使用Java内置的类库来实现ZIP文件的压缩和解压缩,以及解决中文文件名出现乱码的问题。 首先...
// 指定编码格式,以适应不同环境下的字符集 e.setEncoding("gbk"); e.execute(); } ``` - **代码解释**: - `Project` 和 `Expand` 类来自`org.apache.tools.ant`包,这是一个基于Apache Ant的工具集合。 - `...
- 导出数据时,同样要注意设置合适的字符集,以保证导出文件中的中文能被正确解读。 3. **应用程序连接** - 应用程序连接DB2时,也需要配置相应的字符集,如Java的JDBC连接字符串中的`useUnicode=true&...
在Java中,可以使用`Charset`类来指定正确的字符集,例如`StandardCharsets.UTF_8`,确保读写操作都使用UTF-8编码,这可以有效避免中文乱码问题。 3. **压缩文件**: 使用`ZipOutputStream`,可以将文件添加到ZIP...
通过提供的代码文件`CompressTestMain.java`、`GzipUtils.java`和`ZipUtils.java`,我们可以推测作者可能构建了一个测试环境,比较了Gzip和Zip压缩算法在实际操作中的性能差异。 首先,让我们了解Gzip和Zip的基本...
Java字符集是Java编程语言中处理字符编码的基础概念,它对于理解如何在程序中正确地存储、处理和传输文本至关重要。在Java中,字符集主要指的是Unicode字符集,特别是其子集UTF-8,它是Java默认使用的字符编码。Java...
在Java编程语言中,处理压缩文件,如ZIP和RAR格式,是常见的任务。这篇描述提到了一个接口类,专门用于解决解压过程中可能出现的乱码问题。以下将详细讲解Java中解压ZIP和RAR文件的方法,以及如何处理乱码。 1. **...
- **递归压缩文件**:对于每个文件或目录,如果是目录,则递归地对其子文件进行压缩;如果是文件,则直接压缩。 - **关闭资源**:完成压缩后,需要关闭所有打开的输入输出流。 ##### 2. 关键代码解读 ```java ...
1. 使用`ZipFile`类打开ZIP文件,并指定字符集(这里是GBK,以解决可能的中文乱码问题)。 2. 遍历ZIP文件中的所有条目(`ZipArchiveEntry`对象)。 3. 对于每个条目,检查它是否是目录。如果是目录,使用`Files....
在Java编程环境中,处理压缩文件,特别是ZIP格式的文件,是一项常见的任务。有时,这些压缩文件可能包含中文文件名,这在处理时可能会遇到编码问题。`java.util.zip`库是Java标准库的一部分,提供了对ZIP文件的支持...
3. 在创建文件或目录时,确保文件系统支持的字符集与编码一致。 4. 在处理ZIP或RAR头信息(如文件名)时,要特别注意编码转换。 总的来说,理解和掌握文件压缩和解压的原理,以及处理中文乱码的方法,对Java开发者...
当需要处理未知编码格式的文件,尤其是ZIP压缩文件时,问题会变得更加复杂。"获取zip文件编码格式 cpdetector.zip" 是一个工具,它能够帮助我们识别ZIP文件内文本文件的编码格式。 这个工具的关键依赖于三个JAR文件...
在这个例子中,我们创建了一个`Zip`对象,并设置了目标压缩文件的路径。然后,我们创建了一个`ZipFileSet`对象,指定包含中文文件名的源目录,并设置编码为UTF-8。最后,将这个文件集添加到`Zip`任务中,并执行压缩...
`ZipOutputStream`是Java标准库中的一个类,它继承自`FilterOutputStream`,用于创建ZIP格式的压缩文件。当我们使用这个类进行文件压缩时,可能会遇到乱码问题,主要是因为编码设置不当导致的。下面我们将详细探讨...
### Java压缩文件代码详解 #### 一、概述 在日常的软件开发过程中,对文件进行压缩处理是一项常见的需求。无论是为了节省存储空间还是提高传输效率,掌握如何使用Java语言进行文件压缩都是非常重要的技能之一。本...
文件编码决定了字符集的表示方式,而BOM(Byte Order Mark)则是一种特殊的Unicode标记,用于标识文件的编码类型。本文将详细介绍如何在Java中获取文件的编码并判断文件是否带有BOM。 首先,让我们了解一下什么是...