Ubuntu下压缩文件乱码问题小结

  • Post author:
  • Post category:Ubuntu
  • Post comments:0评论

一、问题由来
Ubuntu的Unity和Gnome环境默认的压缩管理器是File-roller,这玩意会调用各种库和程序来完成文件的压缩和解压缩,这是个很好的做法,但可惜的是它调用的库各种不靠谱。好吧,如果你狠心把File-roller干掉,换上xarchiver或者Ark(这个没乱码,但是是QT支持,有洁癖者慎用),那么问题就好多了。
File-roller调用的库包括unrar,unrar-free,p7zip, p7zip-full, p7zip-rar,足足有5个,File-roller会按照一定的顺序来调用这些库,可惜这些库有各自的问题。
unrar,unrar-free在本人的电脑上会显示× unrar is not rar archive,然后完全无法解压。
p7zip, p7zip-full, p7zip-rar对rar乱码无解。

二、解决方法

1.使用unrar
完全卸载p7zip-rar,安装unrar。很多人能够通过这种办法解决,如果你能够正常使用,那么恭喜你了。如果不能,那么接着往下看。

2.使用带中文patch的p7zip
卸载掉p7zip, p7zip-full, p7zip-rar没错,卸掉所有的,然后去网上下载一个带中午补丁的p7zip,安装好,恩,无乱码的世界真美好。如果你足够蛋疼,那么接着往下看。

三、patch干了些什么?
对于一个linuxer来说,没有源码的东西,让人很不放心啊,这个中午patch能解决中文环境下的乱码问题,这么好的补丁问什么没有被Marge到代码中去呢?看看patch做了些什么吧……

-void CInArchive::ReadFileName(UInt32 nameSize, AString &dest)
+#include <iconv.h>
+void CInArchive::ReadFileName(UInt32 nameSize, AString &dest, const char *encoding)
{
...do something
}

这一段将ReadFileName函数增加encoding的控制参数

-  ReadFileName(headerNameSize, item.Name);
+  if (p[3] == NFileHeader::NHostOS::kUnix)
+    ReadFileName(headerNameSize, item.Name);
+  else
+    ReadFileName(headerNameSize, item.Name, MY_ENCODING);

这一段根据文件头信息来选择是使用默认处理方法还是自己修改的函数

+#define MY_ENCODING "gb18030"

在头文件中定义MY_ENCODING

相信这里大家看明白了,这个补丁只对gb18030编码有效。嗯嗯,估计永远不会被接受了……

发表评论