当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : unzip 在UTF-8下解压CP936编码的 zip 文件
帖子发表于 : 2008-01-02 21:03 
头像

注册: 2007-03-13 17:26
帖子: 2254
送出感谢: 0 次
接收感谢: 1
zip 压缩文件时文件名不使用Unicode,在简体中文Win下是用CP936编码的,
在Linux环境 zh_CN.UTF-8 下文件名是乱码。

http://www.bitscn.com/linux/system_mana ... /7149.html
这个好像在 UTF-8 下不能用

重新用 iconv 来变换一下文件名
代码:
---- UNZIP -------------
mkdir ~/unzip
cd ~/unzip
sudo apt-get source unzip
sudo chown `id -u`:`id -u` . -R

cd unzip-5.52
patch -p1 --dry-run <  ../unzip_filename_cp936_to_utf8.patch
patch -p1  <  ../unzip_filename_cp936_to_utf8.patch
debuild clean
debuild binary

sudo dpkg -i ../unzip_5.52-10ubuntu1_i386.deb
echo "unzip hold" | sudo dpkg --set-selections


补丁
代码:
diff -Nuar unzip-5.52/fileio.c unzip-5.52.wwd/fileio.c
--- unzip-5.52/fileio.c   2007-12-26 13:16:41.000000000 +0800
+++ unzip-5.52.wwd/fileio.c   2007-12-26 13:07:47.000000000 +0800
@@ -53,6 +53,7 @@
 
   ---------------------------------------------------------------------------*/
 
+#include  <iconv.h>
 
 #define __FILEIO_C      /* identifies this source module */
 #define UNZIP_INTERNAL
@@ -2145,8 +2146,26 @@
 
         /* translate the Zip entry filename coded in host-dependent "extended
            ASCII" into the compiler's (system's) internal text code page */
+      /*
         Ext_ASCII_TO_Native(G.filename, G.pInfo->hostnum, G.pInfo->hostver,
                             G.pInfo->HasUxAtt, (option == DS_FN_L));
+                     */
+      {   /* XYZ cp936 unzip fileio.c L 2177?  Ext_ASCII_TO_Native */
+         if (G.pInfo->hostnum == FS_FAT_) {
+            iconv_t ic;
+            size_t i=strlen(G.filename);
+            size_t j=MAXPATHLEN;
+            char cv[MAXPATHLEN];
+            char *cv_p = cv, *gf_p = G.filename;
+            bzero(cv,MAXPATHLEN);
+
+            ic = iconv_open("UTF-8","CP936");
+            iconv(ic, &gf_p, &i, &cv_p, &j);
+            iconv_close(ic);
+
+            strncpy(G.filename, cv, MAXPATHLEN);
+         }
+      }
 
         if (G.pInfo->lcflag)      /* replace with lowercase filename */
             STRLOWER(G.filename, G.filename);



zip 的文件格式,WIN下用WINRAR创建的和LINUX用命令行创建的,好像不太一样,zip 的补丁还没改好

RAR和7Z 好像是用 Unicode 来编码文件名的,就是速度太慢,其它的 gz bz2 tar 都不是


附件:
unzip_filename_cp936_to_utf8.patch.gz [681 Bytes]
被下载 135 次
页首
 用户资料  
 
2 楼 
 文章标题 : Re: unzip 在UTF-8下解压CP936编码的 zip 文件
帖子发表于 : 2009-04-25 23:02 
头像

注册: 2008-07-14 22:42
帖子: 8078
地址: Beijing
送出感谢: 0 次
接收感谢: 0 次
似乎没有什么效果,乱码依旧,今天越狱的字幕文件zip格式,直接wine了一个winrar去了 :em04


_________________
Ubuntu User


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译