Total Pageviews

Saturday 20 October 2012

Ubuntu 下的2个乱码问题

 半完美解决 zip 文件中中文文件名乱码的问题

开始打 7z 程序的主意……当然最后是成功了的~

现在做了一个 Ubuntu 的 patch 出来,需要的童鞋可以在这里-https://www.box.com/s/qatf3kk87qcwdxepeuhk下载:p7zip_9.04~dfsg.1-1chinese.diff.gz (1.1KB)。不要看是 9.04 的,据我观察在 lucid 当中版本号还是这个,p7zip 一直没有变化过……
下载完以后再找个目录获取 p7zip 的代码:
1
apt-get source p7zip-full
注意这里不需要 sudo 权限,因为获取源代码是自由的~
然后把刚才下载的那个 patch 文件放进代码目录,一般来说应该是 p7zip-9.04~dfsg.1 目录。然后执行下面代码:
1
gzip -cd p7zip_9.04~dfsg.1-1chinese.diff.gz | patch -p1
然后就常规了:
1
2
make all3
sudo make install
需要注意的是,这里安装完以后并没有覆盖原来 p7zip 包的文件,但是放在了一个更优先访问的位置,所以以后执行 7z 相关的操作都会访问这里安装的。
由于编译需要很长很长时间,所以我这里编译好了一份:p7z-bin.tar.bz2 (1.6M),-
https://www.box.com/s/yyd0s2gcpc2cn7a3n9oa,
是 Ubuntu i386 版本的,如果你也是 i386 的就可以直接下载这个,用里面的程序覆盖掉 /usr/lib/p7zip/ 里面的程序,就可以了~
当然,最好把相同功能的 unzip 先卸掉……
现在,在系统里面以任何方式查看或解压任何 zip,理论上应该不会出现乱码了,我想是这样……

解决思路

好了,对于只想解决问题的人,看到这里就够了。现在我想写写如何做到的。
我看了一下 p7zip 的代码,还算是条理相当清晰,其中最重要的部分是 ZipIn.cpp 里面的 ReadFileName 函数,我在里面读取文件名之后插入了一段使用 iconv 函数转换编码的代码。
其后我发现不能这样简单的转换编码,因为在 Linux 下面打包的 zip 文件,文件名是用 utf8 而非 gb18030 储存的,这样在转换的时候反而出现乱码。我观察了一下,WinRAR 能够正常读出这些文件名的编码。因此我又在另外一些相关的函数中加入了判断打包平台的代码,以确认是否要转换编码。
此外,由于 gb18030 是硬编码进去的,显然不太好,但我暂时想不出什么更好的解决方法。我想这对于目前的国内自己用应该是足够了,不过考虑到开源软件一向喜欢的国际化,我就实在没什么办法了……如果有人有办法,请一定告诉我!
不过为了平衡,我最后在 config.h 里面加入了 MY_ENCODING 宏,这样可以修改这个以改变硬编码的文字编码值,也算是一点点努力吧……

一点抱怨

由于是在上网本上做的,而且我不想折磨我可怜的 SSD 或者移动硬盘,因此我不得不在内存盘中进行编译。每次都是心惊胆战的,生怕内存不够用开始吃交换区……当然最后还是没有……
话说 Windows 混乱的内码转换害死人啊……

参考资料


-----------------------------------------------------------------------------------
首先是下载 rar 压缩包以后打开里面的文件名是乱码。造成这个问题的原因是由于这个压缩包是在 Windows 环境下打包的,而 Windows 中文环境下默认的编码是 GBK ,而 Ubuntu 的默认编码则是 UTF-8 ,所以在 Ubuntu 下打开文件会是乱码。


解决方法很简单,我们打开 rar 文件的时候系统会问我们是否安装 unrar ,安装完毕后系统就能用归档管理器打开 rar 文件。要解决乱码问题,在软件中心里将 rar 卸载了就可以了。


Update: zip 也遇到类似问题,方法是先安装 p7zip-full
sudo apt-get install p7zip-full
再把 unzip 卸载
sudo apt-get remove unzip
再把下面压缩包里面的文件替换到 /usr/lib/p7zip/ 里面
http://u.115.com/file/e6d5l0fc
sudo tar jxvf p7z-bin.tar.bz2 -C /usr/lib/p7zip/
Ps: 本操作只在 i386 系统中可行。


第二个乱码问题则是打开 txt 或者 pdf 也会出现乱码,原因也是跟上面一样,解决的方法就是在 gedit 里面添加 GBK 编码。

在终端里运行 sudo gconf-editor ,打开配置编辑器,apps>gedit-2>peferences>encodings ,然后双击 auto_detected ,将 GB18030GBKGB2312 分别添加,并且移动到第二。千万不要移动到第一,不然不能打开空白文档。
2011-11-27 Update: 在 Ubuntu 11.10 以及 Linux Mint 12 中,由于 gedit 升级了,apps>gedit-2>peferences>encodings 这个节点也没有了,改在了 org>gnome>gedit>preferences>encoding 。所以只需要在终端里运行 dconf-editor (Linux Mint 12 默认没有安装),跳转到 org>gnome>gedit>preferences>encoding,在 auto-detected 和 show-in-menu 的 Value 值里添加上面的值即可,同理也是不能放在第一。