LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 10084|回复: 28

tr:文件名编码转换:从 gb* 转向 utf8 必备工具 convmv @ http://j3e.de/linux/convm

[复制链接]
发表于 2005-1-3 18:54:37 | 显示全部楼层 |阅读模式
帮助文档在 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 是输出文件名,注意千万不要输出到原文件里

  1. iconv  -f  gb2312  -t  utf8  input.txt  -o  output.txt
复制代码

这时用 vi output.txt 就可以顺利打开了
发表于 2005-1-3 18:56:52 | 显示全部楼层
UTF8不錯~~~
大勢所趨
发表于 2005-1-3 19:01:28 | 显示全部楼层
发到软件版比较好
发表于 2005-1-3 21:28:39 | 显示全部楼层
让更多人看到这个软件,顶一下,不犯法吧??
发表于 2005-1-14 18:47:26 | 显示全部楼层
mount  的 fat32 盘有些文件名不能用这个软件改名 ,在nautilus里也不能改名,没试过其他的文件管理器
比如Cs1.5简体中文第二版,在我的机器上是不你能改名的
回复 支持 反对

使用道具 举报

发表于 2005-1-14 22:28:35 | 显示全部楼层
不是在终端中用的命令吗,跟nautilus有什么关系??
回复 支持 反对

使用道具 举报

发表于 2005-1-15 00:59:22 | 显示全部楼层
只是文件名吗?文件中的内容的编码能转换吗?比如一个文件是用GB2312编码的(是文件文件),能不能转换成UTF8的
回复 支持 反对

使用道具 举报

发表于 2005-1-15 08:10:24 | 显示全部楼层
想用不敢用,可靠性如何?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-15 11:50:11 | 显示全部楼层
不妨先备份一份啊……可靠性很好的,如果有同名文件那么不会覆盖掉。可以先试试看。如果参数写错了,还可以回退

要转换文件内容,使用 iconv 命令,在文章中提到了
回复 支持 反对

使用道具 举报

发表于 2005-1-15 13:46:34 | 显示全部楼层
我在网上下载了一些mp3,bmp显示非utf8
于是用comvm转化
无论用comvmv -f gb2312 to utf8   还是comvmv -f cp936 to utf8
系统显示this file was not validly encoded in euc-cn
         this file was not validly encoded in cp936
请问是什么编码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表