最近,做了一个批量图片文件导入到系统中的功能,开始读取的时候,中文名的文件名,出现了乱码现象。

    首先我用了java自身提供的zip相关API进行读取的,出现乱码后,我对文件名进行了编码转换处理,依然还是乱码。

    根据我以往的经验,平常乱码的出现,往往是文件名的编码和系统中读取流的编码方式不一致造成的。

    于是,我查看了Windows系统下的编码方式:

Windows平台下,进入DOS窗口,输入:chcp

    可以得到操作系统的代码页信息:

 

java网页预览zip文件乱码 java zip压缩文件名 乱码_乱码


参考了活动代码页和字符集对照表:

 

java网页预览zip文件乱码 java zip压缩文件名 乱码_java网页预览zip文件乱码_02

GB2312

GB2312


    接着,我看了公司系统的编码方式:

 

java网页预览zip文件乱码 java zip压缩文件名 乱码_乱码_03

百度了一下这个JVM系统参数的含义:

影响文件名的创建

则影响到文件内容。

从中,我们可以看到file.encoding=UTF-8

通过以上的查看和了解,我们接下来做一下乱码的分析:

读取文件会自动使用当前Java编码环境进行读取压缩文件。

    存在两种存在的情况:

环境的编码和上传到服务的文件名编码一致,文件名就显示正常

环境的编码和上传到服务的文件名编码不一致,文件名就会乱码

通过结果分析,我们可以知道JAVA读取文件时使用的码制file.encoding=UTF-8

由于文件名的编码是GB2312,于是中文文件名乱码出现了。

知道了以上原因,那怎么解决呢?

    于是我考虑两种方案:

pass掉了

    方案二:就是修改操作系统的编码或者公司系统的编码,保持二者读取文件编码一致,但是这种改动对操作系统或者公司系统,影响都是太大,不可能改动。

    方案三:在后台获取文件名后,进行乱码的转换进行解决。这种方案,最后让测试采纳。

方案三解决起来并不容易,我用了Java自带的zip API没能实现编码的转换,于是又baidu了一下,发现ant.jar提供了这种编码的转换

import
   import
new ZipFile(file,System.getProperty("sun.jnu.encoding"));

最终实现了中文名的乱码乱码转换,正常显示中文了。

启用的时候,如果没有特别设置字符集,会根据操作系统的字符集,设置默认的字符集。