1
1
2011
47

让Vim在图形界面与终端中的Alt组合键相同

首先祝大家新年快乐!


一直都感觉Vim下快捷键不够用,于是在某一天,我开始使用Alt开头的组合键,然后发现了问题——

在很多终端中,Alt 组合键发送的是 Esc 前缀键码,而图形界面中则是置位最高位。举例来说,Alt-x在图形界面下向Vim发送的是ø(在Vim插入模式下使用Ctrl-V Alt-x可以看到),其编码为0xf1,而x的编码为0x78,区别在于前者二进制编码的最高位是 1,而后者是 0。

而在gnome-terminal、konsole中则是另外一番景象。Alt-x和快速地按Esc x的效果是一样的,仅有xterm 和 rxvt 等终端可选地支持像图形界面的那样处理(参见Vim手册:help :map-alt-keys)。而且,使用置位最高位的终端将导致shell中的Alt-f之类的键绑定失效。

Emacs能处理这种不一致,但Vim不能,于是我一直是使用脚本,使得在终端下和图形界面下使用不同的键绑定。这样图形界面下没什么问题,但终端下比较郁闷:因为映射了Esc开头的键,而Esc是用于回到普通模式的,于是每次按Esc想退回到普通模式时都得等一秒('timeoutlen的值)。这个值又不能设小,不然\ww这种需要多次按键的映射就难用了。

前些天,偶然在帮助文档里看到了这个:

					*:set-termcap* *E522*
需要 {option} 的地方,可以使用 "t_xx" 形式来设置终端选项。这些选项覆盖相应的
termcap 值。设置后,可以用于映射。如果 "xx" 包含特殊字符,须用 <t_xx> 形式: >
	:set <t_#4>=^[Ot
也可用来翻译普通键的特殊键码。例如,如果 Alt-b 产生 <esc>b,可用: >
	:set <m-b>=^[b
(这里 ^[ 是真正的 <esc>,用 CTRL-V <esc> 来输入)
这个方法优于映射之处在于它能适用于所有情况。

也就是说,可以在终端下把Alt组合键都设置到Esc开头的键码,这样一是不用每次设置键映射时设置两个,更重要的是,其本质变了:这样的设置不是键映射,而是指定键码!这样会使用'ttimeoutlen'的值来等待后续键码,和映射无关了,我完全可以把它设置得很小。于是写出新的脚本:

 1 " escalt.vim    控制台下让用 <M-x> 也可用
 2 " Author:       lilydjwg <lilydjwgATgmail.com>
 3 " Last Change:  2010年12月15日
 4 " ----------------------------------------------------------
 5 " Load Once:
 6 if &cp || exists("g:loaded_escalt") || has("gui_running")
 7   finish
 8 endif
 9 let s:keepcpo = &cpo
10 let g:loaded_escalt = 1
11 set cpo&vim
12 " ----------------------------------------------------------
13 " Functions:
14 function Escalt_console()
15   for i in range(65, 90) + range(97, 122)
16     exe "set <M-".nr2char(i).">=\<Esc>".nr2char(i)
17   endfor
18   set ttimeoutlen=50
19   if &term =~ 'xterm'
20     set <F1>=^[OP
21     set <F2>=^[OQ
22     set <F3>=^[OR
23     set <F4>=^[OS
24     set <Home>=^[OH
25     set <End>=^[OF
26   endif
27   for i in ["", "c", "i", "x"]
28     exe i . "map Ï1;2P <S-F1>"
29     exe i . "map Ï1;2Q <S-F2>"
30     exe i . "map Ï1;2R <S-F3>"
31     exe i . "map Ï1;2S <S-F4>"
32   endfor
33 endfunction
34 " ----------------------------------------------------------
35 " Call Functions:
36 call Escalt_console()
37 " ----------------------------------------------------------
38 "  Restoration And Modelines:
39 let &cpo= s:keepcpo
40 unlet s:keepcpo
41 " vim:fdm=expr:fde=getline(v\:lnum-1)=~'\\v"\\s*-{20,}'?'>1'\:1

注意到其中对于F1到F4等键进行了特殊的设置。没办法,这几个键特殊,这样设置我觉得是最优的解了。设置'ttybuiltin'也可以,但是经过一些时间的试用后发现有副作用,具体是什么我忘记了。


PS: SyntaxHighlighter 不支持 Vimscript,还好 Vim 有TOhtml命令。

最新脚本在 GitHub 有。直接复制上面高亮过的代码是不行的。

Category: Vim | Tags: linux vim
10
29
2010
7

金山快盘之跨平台同步脚本

金山快盘是和Dropbox差不多的同步服务,区别只是快盘(目前)只支持Windows,容量只有2G多(我的Dropbox都4G多了~),安全性不好(网页版的使用不加密的HTTP协议)、同步文件夹被设为系统属性等等。

由于某些原因,同学和我通过金山快盘分享文件。于是开始研究之。客户端上传下载时使用XML格式,但数据都加密过了,无解。于是转攻网页版。基本上都是很简单的json,上传使用了个Flash,用Wireshark抓包一看还是HTTP POST。

于是ksync诞生了,仅支持从服务器到本机的单向共享文件同步。如有其它需求可自行扩展。本程序仅需要Python3支持,目前仅在Ubuntu Linux上测试通过。

下载链接。使用前记得编辑ksync文件,把自己的用户名、cookie文件存放路径、同步目标路径替换掉。

Category: python | Tags: linux python json
10
24
2010
4

把Parted Magic装到移动硬盘

首先,不知道Parted Magic为何物的童鞋请先移步这里

之前折腾了Gparted live,然后看到了muzuiget童鞋的留言,决定有时间还是折腾下。首先去官网,结果官网说

As of Parted Magic version 5.3 the USB zip has been discontinued. We are only supporting Unetbootin as the method for booting Parted Magic from a USB drive.

Note: If you still want to do it manually, extract the files from the ISO image and execute the syslinux commands. If you know what you are doing this shouldn't be an issue.

好吧,我在看到第一段,在失望之余,“note”到了后面那段。

fuseiso ~/dl/pmagic-5.5.iso pm

我不喜欢需要根用户权限的mount,所以有一天在新立得里翻到了这个fuseiso,现在用上了。

里边就两个目录,boot和pmagic。pmagic比较简单,先说说它。

它下面也就三项,内核bzImage,initrd文件initramfs,和一个可以用来自定义其模块的目录pmodules,目前只包含pmagic-5.5.sqfs,file之可以知道它是一个Squashfs filesystem。

boot下东西有点多,还好我需要的很少,就是boot/isolinux/isolinux.cfg这个isolinux的配置文件了,里面有需要传给内核的参数,有好几个选项,基本上是这样子的:

LINUX /pmagic/bzImage
INITRD /pmagic/initramfs
APPEND edd=off noapic load_ramdisk=1 prompt_ramdisk=0 rw vga=788 loglevel=0 max_loop=256

APPEND那行就是内核的参数了。于是,grub2的参数应该这么写:

menuentry "Parted Magic (中文)" {
	set root="(hd1,1)"
	echo "Loading kernel..."
	linux /boot/pmagic/bzImage edd=off noapic load_ramdisk=1 prompt_ramdisk=0 rw vga=791 loglevel=0 max_loop=256 keymap=us zh_CN
	echo "Loading initrd..."
	initrd /boot/pmagic/initramfs
}

vga参数我自然要改下的,呵呵。

但是——

内核加载完毕之后它就告诉我找不到pmagic-5.5.sqfs文件……看来需要把它放到分区的/pmagic/pmodules下才行啊。可是我又不是做LiveUSB,是移动硬盘耶,不可能随随便便就把整个分区弄乱的。

于是——

file一下那个initramfs可知它是gzip压缩过的。

zcat initramfs > ../../initrd

然后继续file之,cpio文件。那就继续解包吧:

cat initrd|cpio -i

其实两步是可以一起做的。但没有file以及man cpio之前谁知道呢。

然后我很惊奇地看到一个名为init的可执行文件躺在当前目录下!我都没file,直接把它扔给Vim了。接下来就是看shell脚本了。

find_pmagic () {

   if [ ! -e /test_mnt/${directory}/pmagic/pmodules/pmagic-$VERSION.sqfs ]; then
      umount /test_mnt &> /dev/null
      return
   fi

关键是${directory}变量。继续寻找。。。

for i in $(cat /proc/cmdline); do
   case $i in
      directory=*)     directory=$(get_opt $i) ;;
      iso_location=*)  iso_location=$(get_opt $i)  ;;
      iso_filename=*)  ISO_VERSION=$(get_opt $i) ;;
      root=*)          root=$(get_opt $i)  ;;
      label=*)         label=$(get_opt $i)  ;;
      uuid=*)          uuid=$(get_opt $i) ;;
   esac
done

OK,原来是内核参数,于是在linux那行后面再加上directory=other,重启OK!

10
7
2010
3

grub2不显示自定义菜单项的解决

今天弄gparted的live版,在虚拟机里按照这里的说明配置grub2,却始终不见自己新加的菜单项,只好每次尝试启动gparted时手动输入那一串长长的指令,郁闷啊。。。

Google了半天,用中文只能找到些grub2的配置说明的文章,而且代码十分地不整洁,光看到页面鼠标就不由自主地中键点击标签页标题了。于是换用英文,搜索“grub2 menuentry not display”,也没什么有针对性的结果,于是我点了第一项,是Ubuntu的文档。看了一小会儿后,终于有了重大发现——

  • Do not leave empty spaces at the end of lines

再看看自己复制过来的配置,果然在最后一个}后多了一个空格!

但我还是有点纳闷:为什么行末多了一个空格就不行了呢?也没有错误或警告。。。

Category: Linux | Tags: linux grub
9
9
2010
21

成功实现Linux控制台(纯终端)中文显示与宽屏支持

这里的Linux控制台中文显示,当然不是指安装个zhcon/fbterm/fbiterm之类的东东啦。这些东西在我这里都有些bug。zhcon显示效果不错,还支持输入法,但是滚屏的时候文本几乎不动,根本无法正常使用w3m。fbterm显示的字体很丑,特别是在宽屏下。这个可以调,但我没能调出自己觉得满意的。fbiterm显示要好看点。记得都是有些显示上的问题的。在Ubuntu软件源里还有一个日本人做的jfbterm,在我这里有严重bug——启动Vim后无响应,退出出现段错误,然后无论怎么折腾键盘,就是没任何响应了……

我多想控制台能直接支持中文显示啊!

所以,经过长时间的磨砺后,我终于决定自动给内核打上中文显示的补丁。内核源码在http://www.kernel.org/下载,补丁在这里,我只下了前两个补丁。

这里说一下,打补丁的时候可以直接bzcat xxx|patch -p1,不需要先解压(我终于知道bzcat/zcat这种东西有什么用了 =_=!)。另外,记得参数加-p1哦。我不小心用-p0了,结果N多failed,吓到我了呢。

补丁打好后看看README文件就知道怎么编译了,在Arch的Wiki上有更详细的编译和安装说明。下面是我用过的命令——

mkdir ../build
make O=../build menuconfig
# 注意备份 ../build/.config 文件
make O=../build
sudo make O=../build modules_install
cd ../build
sudo cp -v arch/x86/boot/bzImage /boot/vmlinuz-2.6.35.3-lily
sudo cp -v System.map /boot/System.map-2.6.35.3-lily

#Ubuntu 用,注意有个 - 没了。。。
sudo mkinitramfs -k 2.6.35.3lily -o /boot/kernel26-lily
#Arch 用
#sudo mkinitcpio -k 2.6.35.3-lily -g /boot/kernel26-lily

首先是建立了个输出目录。以后几乎所有的make都要加上O=这个目录。第一个make是配置内核,N多选项,一项项看很费时的,而且似乎是根据系统情况生成的。这里和本文主题息息相关的是要记得选上framebuffer支持,然后选个字体编译进去。我还设置了分辨率的,不知道和后来支持宽屏有没有关系。另外,在这里可以启用启动时的图片。不知道是什么的请移步这里。默认的图片是Tux,当然是可以改的,直接替换drivers/video/logo下相应的图片就可以了,比如我替换的是logo_linux_clut224.ppmppm图片可以使用如下命令生成(via):

pngtopnm linuxlogo.png > linuxlogo.pnm
pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm
pnmtoplainpnm linuxlogo224.pnm > linuxlogo224.ppm

这些弄好后就开始make了,很耗时的,我这里大约用了一个多小时。

这些弄完后就可以重启了(要祈祷的哦 :-))。记得给内核传个vga=791之类的参数,虽然说不传这个也是可以显示汉字的。

幸运的话就这么就OK了,不过还不是宽屏的。我这里进X时会出现“工作在低画质模式”的提示,重启X后正常了,再回到控制台下,发现分辨率莫名地变成宽屏的了~~

后来lsmod看到加载了以前安装了但没有用的nouveau驱动,于是把/etc/X11/xorg.conf也给改了:

Section "Device"
        Identifier      "Configured Video Device"
        Driver  "nouveau"
        # Driver        "nvidia"
        Option  "NoLogo"        "True"
EndSection

Section "Module"
        Load    "drm" # 这个是后来加的
        Load    "glx"
EndSection

这样启用nouveau驱动,不用每次进图形界面时重启X了。控制台表现相当完美,除了不知道为什么登录前的那些文字变成了黄色的。。。而且,在图形界面与控制台界面切换相当迅速,不会先黑一下了。

但是——

但是,不能启动compiz了。compiz的有些窗口管理功能还是相当不错的。我尝试重装安装nvidia的官方驱动,新立得告诉我子进程返回了错误号10。去看了下日志:

*** Unable to determine the target kernel version. ***

也就是说,相应的内核模块无法编译了,不知道应该怎么hack,只好暂时放弃了。555...


2012年10月8日更新:在 ChinaUnix 上的补丁已经失效了。这里有另外的人维护的 cjktty 分支可直接使用。说明

2013年10月25日更新:repo.or.cz 上的 cjktty 不再更新了。新的仓库在 GitHub 上

2021年02月28日更新:Gentoo-zh 上的 cjktty 不再更新了。新的仓库在 zhmars/cjktty-patches

Category: Linux | Tags: linux 中文支持 编译
7
26
2010
10

旧曲赋新词:《不用QQ》

Vim Talks群的tigee lee说:每个在linux下上QQ的同学,上辈子都是折翼的。。。


那天傍晚我再次上线 忍受着唯利是图的疼讯
想起曾经走过的岁月 想起曾经热爱的你
我有我想去的地方 但是我 不能离去
只因为你依然在这里 我憎恨却无能为力
我想哭 却流不出眼泪
我相喊 却发不出声音
我愿意 抛弃我的所有
如果能 不用QQ
夕阳洒在我的脸上 风儿拔动我的心弦
我多想你离开我的身旁 没有你我有多幸福
我想哭 却流不出眼泪
我想喊 却发不出声音
我愿意 抛弃我的所有
如果能 不用QQ
我想哭 却流不出眼泪
我想喊 却发不出声音
我愿意 抛弃我的所有
如果能 不用QQ
如果能 不用QQ
如果能 不用QQ

改编自汪峰演唱的《时光倒流》,墙内的朋友可在这里试听或下载这首歌。

Category: 文学 | Tags: 音乐 linux QQ 腾讯
5
24
2010
8

将du的输出按文件大小排序

du命令的输出结果要么是不人性化的全部以千字节为单位,要么加上-h参数,显示为1K 234M 2G这样易读的数据。可是,我通常想查看那些大文件/目录,或者那些小文件/目录。单单只用sort命令的话,就不得不在脑海转换那些千字节单位的数据了。做为一个Linux用户,电脑能做的我可不想让人脑来做。Google了一下,发现这个帖子提供了一段代码可行,但是输出效果并不理想,于是我略作更改,写出了以下代码:

sdu () {
  du -sk $@ | sort -n | awk '
BEGIN {
  split("K,M,G,T", Units, ",");
  FS="\t";
  OFS="\t";
}
{
  u = 1;
  while ($1 >= 1024) {
    $1 = $1 / 1024;
    u += 1
  }
  $1 = sprintf("%.1f%s", $1, Units[u]);
  sub(/\.0/, "", $1);
  print $0;
}'
}

这段代码使用sort排序原始数据后,再使用awk来转换数字的单位。使用方法为sdu后加要查看大小的文件/目录就可以了。注意我在代码中加了-s参数,如果希望同时查询子目录的话,需要去掉这个参数。

Category: shell | Tags: shell linux
5
23
2010
10

让火狐使用chrome的更好的Flash Player插件

Linux用户可能都知道,Windows平台的Flash Player是做得最好的,Linux和Mac下的非常耗CPU。而且我发现,我的火狐使用的libflashplayer.so 10.0r45版本的插件,每当上传文件时都会导致整个火狐没有响应,Flash上传控件亦无进度显示,直到上传完成才会恢复。所以,今天向DBank上传一个大文件时,我不得不强行关掉火狐,改用Chrome上传,好让火狐依旧能够浏览网页。令我惊讶的是,Chrome里的Flash上传控件表现得竟然比较正常,虽然CPU使用率还是挺高的,但至少不影响其它操作,而且进度指示也正常。

看来Chrome使用了更好的Flash Player插件。好东西可不能让Chrome独享,我遂进入Chrome的安装目录/opt/google/chrome,果真发现了一个名叫libgcflashplayer.so的so文件。我很高就,二话不说,在我的火狐配置目录下建立plugins目录,然后把这个文件链接过来。重启火狐,在插件列表里发现多了一个版本号为10.1r51的Flash Player插件。再上传测试,一切如Chrome中一样,哦耶!

Category: 火狐 | Tags: 火狐 linux flash
5
8
2010
5

[转] Linux的优势——对比Windows

原文地址:http://hi.baidu.com/zhuhongxu/blog/item/089ad5070848e9c57a89470f.html,作者NIX

注:由于百度空间的网页源码过于混乱,所以转载导致了部分格式丧失,建议查阅原文。


Linux的优势——对比Windows

2009-03-06 16:27

很多人不了解Linux,因为他找不到这方面的资料,现在我想用我自己对Linux的使用情况来说明Linux为何优秀,为何值得使用,为何值得推广。

注:以下言论仅代表个人观点,如有错误,欢迎指正!

1、内存使用原则

使用国Windows的同学大概都知道“页面文件”吧,它的作用是扩展内存,就是说用硬盘虚拟内存的方式来为应用程序提供比内存大的多的运行空间。但这个方式有一个缺点,就是硬盘的速度太慢,和内存比就不是一个数量级的。所以如果一台计算机只有256MB的内存或更少至128MB时,虚拟内存(就是某一些硬盘空间)就会被使用的很多,很频繁,结果就是,计算机的运行速度会像乌龟一样慢。

但好在时代进步了,科技发达了。我们能用更少的钱买更多的内存,比如1GB、2GB或更多。于是使用Windows的同学就想了:我能不能将“页面文件”调小,最好到0,这样我的内存就能被充分的利用,计算机速度也就可以提升了。结果很明显,你可以将每个分区下“页面文件”都调至0MB,但Windows本身却不会响应你的要求,你用Ctrl+Alt+Del打开任务管理器,发现虚拟内存(即页面文件)还是在被使用着,尽管你的内存大部分都是“空的“。这就好像你使用一辆宝马车,可是引擎却是拖拉机上的,而且制造商还不让你换,尽管宝马的引擎就在旁边(而且它还属于你)。这就是使用Windows的困境之一:你无法真正掌控你的系统。

对于Linux,你就不会遇到这样的困境。你内存多,可以设置完全不用虚拟内存;你内存少可以设置成现使用内存,不够时再使用虚拟内存;当然你也可以设置成尽量使用虚拟内存,留出你的内存作为它用,或者就是将内存当作摆设(有的人就喜欢使用拖拉机的引擎也是无可厚非的,但关键是要自己能决定)。即,你有决定的权力。

2、安全性

大家多少都听说过一些Linux安全性高方面的事情,但具体对它为何高、或者为何不高却了解得可能就不是很清楚了。请听我道来。

如果有人要拿刀砍你,你当然不希望给人砍到(不排除有人有这方面的嗜好)。所以你想,要是自己手上也有刀甚至有枪,那就不用怕了。可我们是文明人,平常不会在身上带刀带枪的,那怎么办?我们可以穿盔甲。

操作系统也一样,好的操作系统有各种各样的机制(就是有不同的盔甲)来避免自己受到外界的非法干扰。

一个很好很古老的机制就是权限。打个比方就是带头盔保护头部,防弹衣保护胸部,即,将重要部分隐藏起来。尽管我胳膊、腿都在外面,可就算被你捅到,我也死不了。

Windows默认使用的帐户都是超级管理员帐户,用户可以随便读写系统的任何资源,即,所有东西都暴露在外。现在很多人意识到这个问题了,都会建立一些普通用户帐号用于平时的使用,只在关键时候(比如安装软件,查杀病毒,系统调整)使用超级管理员帐户。但这种机制仍然不完善,对于安装在非C:盘的软件,普通用户也是可以“乱来的”。另外,每次安装所么软件或要进行什么重要设置都要先切换到超级管理员帐户进行操作,很不方便。所以有人干脆就一直使用超级管理员帐户。

Linux的机制更好,例如现在最好的Linux发行版之一:Ubuntu所使用的方式是不建立超级管理员帐户(即root帐户)。而使用sudo命令来实现超级管理员要做得事情。即,在虚拟终端(命令行界面)里使用它来暂时获得管理员权限以完成管理员要做得事情。操作完成后,马上就退回到普通用户状态,不会有因为切换帐户而带来的时间浪费,而且系统更安全,重要部分只会暴露一会儿,而在这一会儿的时间就有黑客入侵进来的概率约等于0。相反,Windows一直暴露着,所以被攻击(挂木马、植入病毒)的概率就大大增加了。

所以如果你使用Linux,你可以完全不用担心病毒、木马对你的威胁。在Linux下,病毒、木马没有生存的土壤。所以杀毒软件就是不必要的一种软件了。话说回来,大概使用Windows的同学的计算机上都安装有杀毒软件吧,如果你喜欢重装系统大概就不会用杀毒软件。杀毒软件会占用我们的内存,使用我们的CPU资源,占用网络带宽(因为它老是要升级病毒库,还会对下载的东西进行检查),这些都降低了我们的计算机使用体验质量。所以丢掉那种提心吊胆的感觉吧,投身自由、开源软件的怀抱吧!

3、软件最好的进化方式:开源模式

我要介绍的Ubuntu Linux使用的所有软件都来自开源社区,这些软件都集中在一种叫做“源”的服务器上,当然“源”可以有很多。

 

 

比如我现在使用的电子科大的源(速度可达8MB/s),所以在Ubuntu上安装软件是一件很享受的事情。你可以用图形界面的安装方式,也可以用命令行的方式。所有你需要做的是在窗口中选择你需要的软件,然后点击安装就可以了,剩下的事情就让系统代为负责,大约1分钟以后(或更短的时间),你就可以使用刚安装的软件了。方便无比!这也是自由软件的优势。

而如果你要在Windows下安装一个软件,你要先用搜索引擎搜索一个或几个网址,然后用迅雷或其他什么下载工具去下载。可能软件会需要序列号(非自由软件需要付费,所以大家都明目张胆的盗版,当然这样做是不对的),你又需要去找一个。如此下来,安装一个软件所耗费的时间就可想而知了,而且用户体验很差。而在Windows下所谓的免费软件,大都带有广告,比如迅雷、QQ等。因为他们不开源,是以软件赚钱的,而用户又喜欢盗版,所以只能加广告进去了。使用这带很多广告(或者说垃圾广告)的软件时,用户的体验会是多么的差!

总结,就算为了以上几条理由,也应该尝试一下Linux!

当然Linux也有“不足”。就是很多我们在大学里需要使用的盗版软件没有Linux版!这也和教育有关,中国用盗版习以为常,最可悲的是,大学教师里没有几个对自由软件有什么认识,而且以用盗版为荣。要是什么时候中国政府也学学国外,在教育界推广自由软件多好啊。那时候就不会有丢不下Windows且受制于Windows的情况了(记得黑屏吗?)。

在Google上搜索一下“开源软件”、“自由软件”、“Linux”、“Ubuntu”等词汇。多了解一些吧!

上优酷看看关于Ubuntu、Linux的视频也挺好,多方面了解嘛!

狗熊怎么死的?因为无知而死。我希望大家不要太局限自己,多给自己一些空间,看看外面的世界。千万不要以为自己会使用互联网就是现代人哦,关键是思想。

若要安装Linux,可以选择双系统,你就不用失去Windows,又能领略Linux的风采了。

Ubuntu:Humanity to others(人道待人)。

本文档是在Ubuntu Linux下由OpenOffice.org 3.0制作完成。

SCU.EI.NIX

2009.03.06

Category: Linux | Tags: linux 转载
3
25
2010
22

Linux 下 zip 文件名乱码解决

今天同学向QQ群邮箱里上传文件用了 zip 格式。于是乱码问题再次摆在了面前。

rar 格式和 7z 格式是我所仅知道的两种支持 UTF-8 格式的压缩文件格式。本来平时大家都喜欢用 rar 格式的,不知道为什么这次得到课件的同学却使用了 zip 格式。以前 zip 是支持指定编码解压的,但不知什么时候升级了后就没有这个选项了。于是尝试使用我曾经写过的gbkunzip这个 Python 脚本来解压,却出错了,说不能用 latin1 解码某个字符。

晕啊!当初只为了一时之需没好好写,当时测试成功了现在却不行了。尝试着改了几下,无果,于是去看zipfile的代码,才知道转码时应该用cp437编码来着。改正后,在为文件更名时另一个错误跳出来:OSError!查了 Python 手册,应该os.rename()不支持对目录更名。

真是麻烦啊。本来我是把文件解压出来再改名来着。现在我有点烦了,决定从源头入手,把zipfile拿来自己修改,把所有的 utf8 都改成了 gb18030,然后解压那个文件,成功!当初写那个脚本时我怎么没想到这样做呢?

不过,这次解压是成功,还不知道以后会不会再出什么问题。以后遇到问题再完善吧。

2013年5月21日更新:添加对加密 zip 文档的支持。


脚本在此。Arch Linux 用户可从 AUR 安装。

Category: Linux | Tags: linux 乱码 zip

Mastodon | Theme: Aeros 2.0 by TheBuckmaker.com