虽然主流的几大 Linux 发行版都开始逐渐将 UTF-8 作为默认字符集,但以前在网上看到有人写过 All things in UTF-8 之类的文章,一副慷慨赴死的样子,让我不寒而栗。

然而,虽然我一开始对 UTF-8 持抵制态度,但时间长了还是忍不住要观望一下。而且在 GBK 环境下,基于 GTK2 的程序中保存的中文文件名老是乱码——包括 Firefox,于是忍无可忍后,我终于还是换成了 UTF-8。

在 UTF-8 下也生活了将近三年了,时至今日,写篇文章总结一下由 GBK 到 UTF-8 迁移过程中的一些痛苦。

1 文件名

迁移之前滇狐一直以为将所有文件名转换成为 UTF-8 是一件非常痛苦的事情,正式开始迁移之后才发现,问题一点都不严重。滇狐平时一直养成了用英文名作文件名的好习惯,因此真正需要转换的文件名仅限于 mp3、电影和一些电子书等。安装 convmv 这个好用的工具后,切到这几个目录下,简单地运行一下:

convmv -r -f cp936 -t utf-8 --notest *

立刻就转换过来了。

2 lftp

FTP 是一个比较严重的问题:目前国内绝大部分 ftp 都是 GBK 编码的。所幸 lftp 的转码功能非常强,因此在你的 ~/.lftprc 中加入以下内容即可:

set ftp:charset "GBK"
set file:charset "UTF-8"

3 FAT32 分区

许多人机器上都会有 FAT32 分区,在把系统转换成 UTF-8 之后,mount FAT32 分区的时候也要进行相应转码,在 -o 后原有参数后再加上如下选项:

mount /dev/yourdev /your/mount/point \
    -o ...,codepage=936,iocharset=utf8,shortname=winnt

4 文本文件

文本文件基本没有什么转换的必要,因为滇狐平时编辑文件都使用 VIM,而 VIM 始终可以正确地识别各种中文编码。因此除非有什么特殊需要,我没有必要将以前的 GBK 编码的文件转换为 UTF-8 的。如果必须转换的话,用 VIM 打开文件后 :set fenc=utf-8,再 :wq 就可以了,很省事。如果需要批量转换的话,还可以用 iconv。

5 Viki

首先,我们使用一个简单的脚本把所有的 .viki 文件转成 UTF-8 编码的:

for file in *.sh
do
    iconv -f gbk -t utf-8 < $file > $file.utf8
    mv -f $file.utf8 $file
done

然后,在编译 .viki 文件的时候,加上“-m utf8”参数,告诉 deplate 该文件已经是 UTF-8 编码就可以了。

6 Python

之前用 pickle 在文件里存放了一些对象,当然,对象里也包含了字符串。切换到 UTF-8 之后,由于解码失败,那些对象无法读出来了。因此,各位 Python 爱好者以后在存储对象的时候,一定记得要使用 Unicode 字符串,这样不容易出问题。

7 QTerm

很荣幸能让 QTerm 在我这份简短的笔记里能有如此重要的地位。该死的 QTerm 在保存配置文件和地址簿的时候没有使用 Unicode,也没有记录编码信息。因此在切换到 UTF-8 环境下之后,我们需要手工把 ~/.qterm/address.cfg~/.qterm/qterm.cfg 的编码转换一下,转换方法参看前面的“文本文件转码”。

8 LaTeX

LaTeX 目前 CJK 已经支持 UTF-8,在 LaTeX 中使用 UTF-8 的详细示例请参看这里

9 MP3

目前绝大部分 MP3 中的 tag 都不符合标准,而 Amarok 等播放器又坚决不支持非标准 tag,因此我们需要一个转码程序把这些 MP3 中的 tags 转换一下。在 Debian 下安装 python-mutagen 包,然后在 MP3 的目录下运行:

find . -iname "*.mp3-execdir mid3iconv -e GBK {} \;

就可以将所有 tags 转换为 UTF-8 编码。

标签:Linux GBK UTF-8 迁移