[转帖]文件名编码转换:从 gb* 转向 utf8 必备工具 convmv

参与到Ubuntu的翻译中来
回复
yongyi
帖子: 3025
注册时间: 2005-05-07 23:57
联系:

[转帖]文件名编码转换:从 gb* 转向 utf8 必备工具 convmv

#1

帖子 yongyi » 2005-07-03 10:44

帮助文档在 http://j3e.de/linux/convmv/man/,本文是翻译

convmv - converts filenames from one encoding to another
将文件名由一种编码转换为另一种编码

命令的用法与 iconv(1)(*) 类似。

-f ENCODING
specify the current encoding of the filename(s) from which should be converted 原文件的文件名编码
-t ENCODING
specify the encoding to which the filename(s) should be converted 目标文件的文件名编码
-r
recursively go through directories 递归地处理子目录
--list
list all available encodings. To get support for more Chinese or Japanese encodings install the Perl HanExtra or JIS2K Encode packages. 列出已知的编码。要支持更多的中文或日文编码,安装 Perl-HanExtra
--nosmart
by default convmv will detect if a filename is already UTF8 encoded and will skip this file if conversion from some charset to UTF8 should be performed. --nosmart will also force conversion to UTF-8 for such files, which might result in ``double encoded UTF-8'' (see section below). 如果文件名已经是 utf-8 那么 convmv 会自动探测出来,不做处理,但是如果不想让 convmv 自动探测,就使用这个选项
--help
print a short summary of available options 输出帮助信息


设想这样的场景
1. 你以前用过 redhat 9 甚至更老的系统,你的系统中默认编码是 gb2312,你的文件名有不少是中文的。然后你跟随 fedora 的脚步,升级到了最新的 fedora core,默认编码是 utf8。你发现过去留下来那些文件的文件名都变成了乱码,或者“非法的 utf-8 序列”
2. 你全新安装了最新的 fedora core 3 系统,然后按照网上各种各样的说法,在安装 fcitx 的时候把默认编码从 utf8 改成了 gb2312 或者 gbk 甚至是 gb18030,这种改动真的是非常简单,并且在 mount 的时候要多一句 mount -o iocharset=cp936 (命令行真是长得太过分了)。然后突然有一天,你不得不换用其他语言登录系统。和上面一样,所有中文的文件名都变成了“非法的 utf-8 序列”
3. 你用着 utf-8 默认编码。然后,你开了一个 ftp,让大家上传些东西;或者你用着古老的 samba 2.x 版本。你会发现别人上传的文件名是中文的文件都变成了问号。还有,如果不是用版上那位可敬的同志修改的 gftp 下载文件,那么下载到的东西凡是中文文件名就都不可识别了,“非法的 utf-8 序列”


convmv is meant to help convert a single filename, a directory tree and the contained files or a whole filesystem into a different encoding. It just converts the filenames, not the content of the files. A special feature of convmv is that it also takes care of symlinks, also converts the symlink target pointer in case the symlink target is being converted, too.

convmv 可以处理单个文件,某个目录树以及其中的文件,甚至整个文件系统,将其中的文件名和目录名转为另一种编码。它只对文件名进行操作,而不修改文件内容。它会正确处理链接,将链接目标指向转换后的文件。如果某个目录中只有一部分文件名是 utf-8,而另外一部分是传统的编码, convmv 也可以处理这种情况——它会自动判断编码类型,只转换需要的那一些。

如果某些文件名已经是 utf-8 编码了,你却禁止 convmv 自动判断编码类型,导致这些文件名也被转换了一次,那么可以用 convmv 来将它们恢复原状,只要将 -f 和 -t 反过来用就可以了。

--qfrom 选项十分有用,它的意思是处理过程中不要输出原文件名。因为这些文件名在你当前的终端中是乱码,它会把终端搞得一团糟。

参见 locale(1) utf-8(7) charsets(7)
作者 Bjoern JACKE (Send mail to bjoern [at] j3e.de for bug reports and suggestions.)


(*)
iconv(1) 用于将一个文件的内容由一种编码转换为另一种编码,例如,假如某个文档 input.txt 是从 windows 中编辑的,是 gb2312 编码。在默认编码为 utf8 的 fc3 环境中,如果使用 gedit 打开,那么 gedit 会自动识别;但是如果使用 vi 打开,那么就会看到乱码了,这时候就应该先用 iconv 来将文件转码再打开。-f 是 from,是原文件的编码;-t 是 to,是转换目标文件的编码;-o 是输出文件名,注意千万不要输出到原文件里

代码: 全选

iconv  -f  gb2312  -t  utf8  input.txt  -o  output.txt
这时用 vi output.txt 就可以顺利打开了
独自看一看大海
总想起身边走在路上的朋友
Lenovo E290-420[Celeron-M420/256M/60G/Intel GMA950]
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
联系:

#2

帖子 firehare » 2005-07-04 16:48

赞一个!
记得以前我也为这个东东找了不少的资料!
我心无畏,源自于我心无知。
图片
头像
yonsan
帖子: 887
注册时间: 2005-07-01 18:56
来自: 广州市

#3

帖子 yonsan » 2005-07-06 16:37

:lol: 呵呵,记得刚开始转用zh_CN.utf8时还真的为这些转换而烦恼!!
后来配置好gvim就可以用gvim自动转换编码查看文件内容!
也算解决了这个问题!!
I will be back!
头像
millenniumdark
论坛版主
帖子: 4159
注册时间: 2005-07-02 14:41
系统: Ubuntu 14.04 (Kylin)
联系:

#4

帖子 millenniumdark » 2006-07-31 16:11

先放着
回复