- 浏览: 908161 次
- 性别:
- 来自: 大连
-
文章分类
- 全部博客 (319)
- Thinking / 反思 (27)
- 我读的技术类图书 (3)
- 我读的非技术图书 (3)
- Java & Groovy (55)
- Ruby/Rails (9)
- Python (10)
- C/C++ (14)
- C# & .net (9)
- 互联网相关技术 (6)
- Database (6)
- Unix/Linux (6)
- WindowsDev (21)
- 工具使用 / Tips (62)
- 编程技术杂谈/咨讯 (6)
- 软工 / 敏捷 / 模式 (6)
- 易筋经 / 各种内功 (3)
- 充电 / 他学科知识 (6)
- 外语学习 (16)
- 我和宝宝的甜蜜生活 (24)
- 八卦 (3)
- 健康 (0)
- 无类别 (0)
- mTogether (4)
- 一页纸 (3)
- SAP (7)
- baby (2)
- abap (2)
- temp (1)
- network (1)
- 生活 (1)
最新评论
-
daliang1215:
收藏一下,好东西。 xp 的快捷键用的非常爽,到win7缺没有 ...
Windows7: 右键任务栏上的一个窗口, 用快捷键c关闭它 -
Alice南京:
感谢
Java GC 监视方法与工具 -
wjason:
今天在excel 2010上面写了一些代码,果然lookup有 ...
Excel 公式: 根据一个单元格的用户输入值, 自动设置另一个单元格的值 -
wjason:
因式分解:http://zh.wikipedia.org/wi ...
教孩子学编程: 数学题1 -
bbls:
不错 找了好久了
VS2010: 在Solution Explorer中,自动关联当前正在编辑的文件
标题:
"中文系统下打的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包的方法如下:
上面的命令是压缩文件夹, 压缩文件的方式类似.
其中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
评论
C:\> assoc .rb=RubyScript
C:\> ftype RubyScript="C:\ruby1.9\bin\ruby.exe %1 %*
省掉每次都键入.rb
C:\> set PATHEXT=.rb;%PATHEXT%
发表评论
-
批量替换,一个文件夹中, 所有文件中的某个特定字符串(For Lync Update)
2015-10-10 10:31 2005因为Office升级, 需要对所有的脚本内容, 做如下字符 ... -
Snagit: "在截图中自动添加时间戳"功能的开启与关闭
2015-07-21 16:27 1671Snagit有这样一个功能 - "在截图中自动添 ... -
教孩子学编程: 幻方及其编程求解
2015-03-03 08:40 965旨在培养孩子们对编程,科学的兴趣. 幻方(M ... -
教孩子学编程: 数学题1
2014-02-08 13:59 1375我想有一天, 我会教孩子们编程. 下面一个很有趣的例子. ... -
网易公开课 - 让我们教孩子编码吧
2014-01-05 15:44 1388看了这个网易公开课. http://v.163.com/m ... -
Alias for Command Parameter for Bash
2013-12-30 12:25 1474bash的alias(别名)不直接支持$1,$2,$3,这 ... -
grep tools on windows
2013-12-28 19:52 1399最开始一直使用这个工具. FileLocator Lit ... -
VIM: 编写自己的“高亮显示syntax文件"
2013-10-13 08:52 981The following link is very use ... -
AutoHotKey: 从资源管理器中,获取被选择的文件的路径(及文件夹)的API
2013-10-12 11:49 7189从下面的URL中,获得了这个Library. Ge ... -
Everything Command Line Option
2013-09-14 10:56 1302Run "everything --help&q ... -
Links
2013-07-27 21:03 1171Reference Card DZone refc ... -
Wireshark Filters
2013-06-23 16:18 1743Wireshark是一款非常好用的网络抓包工具: htt ... -
在linux的VMware虚拟机中, 无法访问VMware的Shared Folders
2013-06-11 21:41 2447在一个VMware虚拟机的Setting中可以设置Shar ... -
Excel条件格式: 根据某一列单元格的值, highlight整行
2013-06-11 10:43 13841[追记 about excel Conditional F ... -
绿色安装ruby后,进行的一些设置,让.rb脚本可以直接运行
2013-06-08 13:27 1320在XP时代,我们可以在【资源管理器 - 工具 - 文件夹选项 ... -
Ruby:使用Ruby脚本,快捷切换鼠标左右手习惯
2013-06-08 12:37 1371在下面这篇博客里,我使用C#,写了一个命令,可以快捷的切换 ... -
VIM: 查看log文件时的一些技巧, 关于如何展示搜索结果
2013-05-25 08:21 2294最近的学习工作中, 查看log文件需求特别多, 于是我对 ... -
Vim: Windows7中, 通过右键菜单加快捷键v, 快速启动vim
2013-05-22 14:39 3671在xp时代, 安装了vim之 ... -
Windows7: 右键任务栏上的一个窗口, 用快捷键c关闭它
2013-05-10 21:34 3451右键任务栏上的一个窗口, 在弹出菜单之后, 按下字母c, ... -
Windows 7: 单显示器, 窗口布局快捷键
2013-05-09 17:24 1743使用但显示器, 尤其是使用笔记本的用户, 应该有过这样的感 ...
相关推荐
在日本经常使用zip或者lha格式的压缩包,在中文系统下解压时,如果压缩包里的文件是日语名,虽然能正常解压,但是解出的文件会变成乱码。这实际上是日语系统使用Shift-JIS编码,在中文系统下解压时按照GB编码显示...
4. **安全性和兼容性**:不是所有的字体都与Windows系统完全兼容,因此在更换系统字体时,应确保所选字体在多个应用程序中都能正常显示,避免出现乱码或显示不全的问题。此外,修改系统关键字体可能会破坏系统稳定性...
UTF8是Unicode的一种实现方式,是一种常见的字符编码标准,支持全球大部分字符集,包括中文、英文、日文等多国文字。在PHP开发中,使用UTF8编码能确保网站可以正确处理各种语言的字符,避免出现乱码问题。因此,...
由于文件名称列表显示为乱码,这可能意味着文件名使用了非标准字符或在某些环境下不支持显示,这通常发生在文件名包含特定语言字符集(如中文、日文等)或是文件名被损坏的情况下。新建文件夹 (2)表明原文件夹中至少...
此工具的使用场景可能包括软件开发、网页设计、文本处理等,尤其是在处理跨语言或多语言项目时,能够有效避免乱码问题。通过这个工具,用户可以更好地理解和解决与字符编码相关的技术问题,提高工作效率。 由于标签...
这使得它在处理包含非英文字符的文件名时,不会出现乱码问题,特别适合处理包含中文、日文、韩文等多语言文件的压缩包。此外,Bandizip还提供了预览功能,用户无需解压即可查看图片、文本文件等内容,提高了工作效率...
修改扩展界面支持库一,禁止透明标签在父窗口刷新时自动刷新,以解决其导致窗口刷新缓冲的问题。 8. 改进应用接口支持库中“设置屏幕分辨率”命令。 9. 修改外部数据库在“表中记录数为零”时可能导致程序崩溃的...