`

"中文系统下打的zip压缩包, 日文系统下查看时文件名乱码问题"的解决方案

阅读更多

标题:

"中文系统下打的zip压缩包, 日文系统下查看时文件名乱码问题"解决方案:

   -  在压缩/解压缩zip包时, 指定文件名的编码方式

 

正文开始......

我们公司使用的操作系统是中文, 我们经常需要把一些文件压成zip包, 然后发给日本总公司,

当然, 日本同事使用的是日文操作系统.

这个时候, 如果zip包中所有文件都是ascii字符, 那么没问题,

否则, 如果zip包中包含汉语或者日语字符那么对方看到便会出现乱码.

 

原因在于:

无论是windows默认的zip压缩工具, 还是7-zip, 在zip压缩或者解压缩的时候,使用的都是系统默认编码来表示文件名,

也就是说windows上面是gb2312, 而日文windows上面用的是shift-jis

使用gb2312编码的zip文件名, 在日文windows上面使用shift-jis来查看, 自然是乱码的.

 

还有一类人, 应该也受这个问题所苦.

他们(也包括我)有时候会从日本的站点(share等)下载一些压缩包(漫画之类),

这些压缩包是在日文系统下压缩的, 如果文件名包含日语, 在我们中文的系统上解压就会出现乱码.

 

我以前的解决办法是弄一个日文的虚拟机,

无论是解压还是压缩都在虚拟机上进行.

(前一个公司, 日本和中国都使用日文的windows, 便没有这个问题)

 

然而为了一个压缩包就开要打开一个虚拟机,难免有些麻烦

所以我的期望是:

在压缩zip包,或者解压缩zip包时, 能够制定对文件名的编码方案.

比如我在中文系统上制作一个压缩包, 我可以指定: 对文件名使用日文编码进行编码.

这样以来, 在日文os上查看时,变不会产生乱码.

 

调查了一下, 这个问题可以通过DotNetZip 来解决,

DotNetZip对自己的介绍是: Zip and Unzip in C#, VB, any .NET language

给我们提供的资源也很贴心:

有源代码, dll, 还有基于这些源代码和dll的工具, 有命令行的, 也有GUI的zip工具,

这些工具也有源代码, 同时还提供了C#,VB等语言的例子(我看了一下, 集成到自己的程序中也很方便).

download 页面在这里.

 

我下载的是: DotNetZipLib-DevKit-v1.9.zip

解压缩之后在DotNetZipLib-DevKit-v1.9\Tools\路径下面,会有两个命令行工具: Zipit.exe 和 UnZip.exe

(其实还包括一个GUI工具,叫DotNetZip-WinFormsTool.exe, 不喜欢命令行的移步这里)

zipit.exe是压缩的命令行, UnZip.exe是解压缩, 他的参数类似, 都支持指定编码.
这次我使用的工具就是他们. 他们的命令行参数在这里 .

也可以从这个链接导航进来: DotNetZip - Zip file manipulation in .NET languages

 

使用这个命令行工具, 指定编码打zip包的方法如下:

 

Zipit.exe "C:\_TryZipIt\测试文件夹.zip" -r+ -cp 932 "C:\_TryZipIt\测试文件夹"

 

上面的命令是压缩文件夹, 压缩文件的方式类似.

其中cp这个参数指的是code page. 不同系统对于同一种编码的code page可能会不同, 详参Code page@wikipedia

如何知道一个编码对应的code page呢?

可以通过如下代码取得(C#为例), 或者google吧.

根据结果, 日文windows的默认编码shift-jis对应的code page是932.

            var cp_shiftjis  = System.Text.Encoding.GetEncoding("shift-jis").CodePage;
            var cp_eucjp    = System.Text.Encoding.GetEncoding("euc-jp").CodePage;
            var cp_gbk      = System.Text.Encoding.GetEncoding("GBK").CodePage;
            var cp_gb2312 = System.Text.Encoding.GetEncoding("gb2312").CodePage;

 

 

 

然而使用上面的命令行, 每次输入的参数还是太多,于是我写了一个ruby脚本包装了一下上面的命令行.

这个脚本每次只接受一个参数, 他代表一个文件或者文件夹.

他的功能是, 在跟输入参数相同的文件夹下, 创建一个同名的.zip文件.

相当于7-zip邮件菜单中的: 添加到 "XXX.zip"

使用这个脚本的前提是你要将zipit.exe放到path中

 

# encoding : utf-8

def show_usage_and_exit(msg)
  puts "please input the path to zip"
  puts "error msg: #{msg}"
  exit 0
end

show_usage_and_exit("no path to zip") unless ARGV.length == 1

#puts ARGV[0].dup.force_encoding("GBK").encode('utf-8')
zip_input = ARGV[0].dup.encode('utf-8')
show_usage_and_exit("path does not exist") unless File.exist? zip_input

if File.directory? zip_input
  zip_output = zip_input + ".zip"
else
  zip_output = zip_input.gsub(/\.\w{2,4}\z/,".zip")
end
File.delete zip_output if File.exist? zip_output

zip_cmd =   "#{%Q<Zipit.exe "#{zip_output.encode("GBK")}" -r+ -cp 932 "#{zip_input.encode("GBK")}">}"

puts "the path to zip is:\n\t" +  zip_input;
puts "the target path is:\n\t" +  zip_output;
puts "the zip command is:\n\t" +  zip_cmd.encode("utf-8");

puts "\n------------------------------ zip process start...---------------------\n\n"
#puts `#{zip_cmd}`
puts `#{zip_cmd}`.encode("utf-8")



 

 

在windows上面, 除了7-zip, 和DotNetZip以外,

还可以使用一些其他的命令和脚本, 来制作zip包.

参下面这些链接:

Can you zip a file from the command prompt using ONLY Windows' built-in capability to zip files?

Does Windows have a built-in ZIP command for the command line?

Can Windows' built-in ZIP compression be scripted?

Zip and UnZip Files Using the Windows Shell (XP, Vista, 2003 and 2008) and VBScript

 

 

-----------------------------------------------------------------------------------------------------------------------------

追记:2012.07.02

-----------------------------------------------------------------------------------------------------------------------------

重新新封装了一下这个ruby脚本,
在一个脚本中同时支持zip和unzip.
如果输入参数不是以.zip扩展名结尾, 那么使用日文系统的编码, 将其在当前文件夹中压缩.
如果输入参数是以.zip扩展名结尾, 那么使用日文系统的编码, 将其在当前文件夹中解压.
其中用到zipit和unzipit两个命令
zipit是把DotNetZipLib的命令行工具直接拷贝path中,
unzipit是把DotNetZipLib的叫做unzip.exe的命令改名而来.

 

# encoding : utf-8

def show_usage_and_exit(msg)
  puts "please input the path to zip"
  puts "error msg: #{msg}"
  exit 0
end

def check_parameter
  show_usage_and_exit("no path to zip") unless ARGV.length == 1
  show_usage_and_exit("path does not exist") unless File.exist? ARGV[0].dup.encode('utf-8')
  puts "===your input is===:\n" +  ARGV[0].dup.encode('utf-8')
end

def run_cmd(cmd)
  puts "===the command is===:\n" +  cmd.encode("utf-8") + "\n\n---------- command start...------------\n"
  puts `#{cmd}`.encode("utf-8")   #puts `#{cmd}`
end

def to_zip_cmd(input_str)
  if File.directory? input_str
    zip_output = input_str + ".zip"
  else
    zip_output = input_str.gsub(/\.\w{2,4}\z/,".zip")
  end
  File.delete zip_output if File.exist? zip_output

  "#{%Q<Zipit.exe "#{zip_output.encode("GBK")}" -r+ -cp 932 "#{input_str.encode("GBK")}">}"
end

def to_unzip_cmd(input_str)
  "#{%Q<Unzipit.exe -cp 932 -d "#{File.dirname(input_str).encode("GBK")}"  "#{input_str.encode("GBK")}">}"
end

check_parameter
input_str = ARGV[0].dup.encode('utf-8')     # ;puts ARGV[0].dup.force_encoding("GBK").encode('utf-8')
if input_str.end_with?  '.zip'
  run_cmd(to_unzip_cmd input_str)
else
  run_cmd(to_zip_cmd input_str)
end

 

 

 

分享到:
评论
1 楼 wjason 2012-08-15  
关联文件类型:
C:\> assoc .rb=RubyScript
C:\> ftype RubyScript="C:\ruby1.9\bin\ruby.exe %1 %*

省掉每次都键入.rb
C:\> set PATHEXT=.rb;%PATHEXT%

相关推荐

    zip库(解决文件名中文乱码问题).zip

    "zip库(解决文件名中文乱码问题).zip" 提供了一个针对C++编程语言的解决方案,专门用于处理ZIP文件中中文文件名的乱码问题。这个问题在处理包含非ASCII字符(例如中文字符)的文件时经常出现,因为标准的ZIP库可能不...

    Java中压缩与解压--中文文件名乱码解决办法

    这个问题主要源于Java中默认使用的编码方式与实际文件名编码不一致,尤其是在Windows系统下,文件名通常采用GB2312或GBK编码,而Java中的`ZipInputStream`和`ZipOutputStream`类默认使用的是Unicode编码,这种编码...

    解决中文Windows系统下解压日语名文件乱码的小工具

    在日本经常使用zip或者lha格式的压缩包,在中文系统下解压时,如果压缩包里的文件是日语名,虽然能正常解压,但是解出的文件会变成乱码。这实际上是日语系统使用Shift-JIS编码,在中文系统下解压时按照GB编码显示...

    JDK ZipEntry压缩中文文件名乱码解决

    项目中碰到问题.jdk zipEntry 压缩中文文件名乱码  上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项.  第二种 就是拿来主义,因为 开源项目 Ant 里已经有...

    解压文件时中文乱码问题处理

    本文将详细探讨如何在使用7-Zip软件解压文件时解决中文乱码问题,以及如何在C#编程环境中处理这一问题。 首先,我们需要了解乱码产生的原因。中文乱码通常是因为字符编码不一致导致的。当压缩文件创建时采用了一种...

    基于Java向zip压缩包追加文件

    通过上述步骤,可以实现基于Java向ZIP压缩包追加文件的功能,虽然这个过程涉及解压和再压缩,但它是最常见的解决方案,因为Java的标准库不直接支持追加操作。在实际应用中,可以根据具体需求进行优化和调整,以满足...

    SharpCompress 解压缩zip,rar文件,解决中文乱码

    本文将深入探讨如何使用SharpCompress这一开源库来处理ZIP和RAR文件,并解决在处理中文文件名时可能出现的乱码问题。 SharpCompress是一款强大的、跨平台的压缩库,支持多种压缩格式,包括ZIP、TAR、GZIP、BZIP2、7...

    java zip压缩解压工具解决中文乱码问题

    在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...

    文件解压和压缩 解决中文乱码

    在处理中文文件名时,关键在于确保正确设置字符编码,通常为UTF-8,以避免乱码。 ```java import java.io.*; import java.util.zip.*; public class CompresszZipFile { public void unzip(String zipFilePath, ...

    ZipUtil文件压缩工具类(解决中文乱码)

    总之,`ZipUtil`文件压缩工具类通过结合`ZipEntry`和`ZipOutputStream`,提供了一种高效且健壮的解决方案,尤其适合处理包含中文字符的文件和目录,确保在压缩和解压过程中不会出现乱码问题。这对于需要在Java应用...

    ZipOutputStream 压缩文件以及乱码问题解决方案

    当处理非ASCII字符(如中文、日文等)的文件名时,可能会出现乱码。这是因为ZIP格式默认使用的是老式的CP437编码,不支持Unicode。为了解决这个问题,我们需要在创建`ZipEntry`时指定合适的编码,例如UTF-8: ```...

    java zip压缩包 解压zip Eclipse项目

    java 打zip压缩包 解压缩包Eclipse项目20111011 java 打zip压缩包 解压缩包Eclipse项目20111011java 打zip压缩包 解压缩包Eclipse项目20111011

    回调有进度条的解压Zip压缩包,解决压缩包内路径中文乱码问题

    只支持zip压缩包的解压,支持压缩包内中文路径、回调有进度条和正在解压的名字 ******************************** 重要说明:该压缩包内的是两个工具类,不是完整的demo。 实现方法:实现回调接口,调用解压方法即可

    日文乱码转换工具

    【标题】"日文乱码转换工具"涉及的是在处理日语文本时可能出现的编码问题。乱码通常出现在计算机系统不支持或识别错误的字符编码格式时,导致文本无法正常显示。日文乱码尤其常见,因为日语使用了多种字符集,包括...

    【文件下载】及解决文件名中文乱码问题

    本文将深入探讨“文件下载”以及如何解决文件名中文乱码问题,这在处理多语言环境下的数据交流时显得尤为重要。 首先,我们要理解文件下载的基本原理。在Web环境中,文件下载通常涉及HTTP协议的GET请求。服务器接收...

    ICSharpCode.SharpZipLib压缩解决中文乱码dll和代码

    总结,ICSharpCode.SharpZipLib通过设置正确的编码参数,可以有效地解决在处理中文文件名时出现的乱码问题。在创建和解压缩ZIP文件时,应特别注意文件名和内容的编码设置,以确保数据的完整性和正确性。

    Linux下rar及zip压缩包中批量替换某文件脚本

    在Linux环境下,对rar和zip压缩包进行批量替换文件的操作是一项常见的系统管理任务。这通常涉及到脚本编程,以便自动化处理大量的压缩文件。标题提到的`zip_replace.sh`和`rar_replace.sh`就是两个用于执行这个任务...

    解决java压缩zip文件时的中文乱码问题(包含jar包和工具类)

    解决java压缩zip文件时的中文乱码问题 实现:java压缩文件成zip实现无乱码。 包括:写好的工具类与jar包。 使用方法:导入ant.jar包,调用CompressExcelOperate中的方法,即可实现压缩文件,并保证没有中文乱码...

    zip解压缩乱码的解决方案

    本文将深入探讨ZIP解压缩乱码的解决方案,帮助你解决这个问题。 1. **理解字符编码** - 字符编码是计算机存储和显示文本的方式,常见的有ASCII、GBK、UTF-8等。不同的编码方式对于特殊字符的表示不同,如果编码不...

    java加密解密zip压缩包

    在Java编程环境中,创建一个能够加密和解密ZIP压缩包的项目是一项常见的需求,尤其是在处理敏感数据时。本文将深入探讨如何使用Java实现这一功能,同时也会提及与ActionScript 3(AS3)进行加密解密的相关知识。 ...

Global site tag (gtag.js) - Google Analytics