LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: bbbush

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

[复制链接]
发表于 2005-4-27 13:27:01 | 显示全部楼层
那问题是如何知道某个txt文件的编码格式呢,-f -t后面的参数是需要自己填写的阿,-f gb2312,我怎么知道这个txt是gb2312的编码格式?
回复 支持 反对

使用道具 举报

发表于 2005-5-28 13:18:37 | 显示全部楼层
Post by qhgary
那问题是如何知道某个txt文件的编码格式呢,-f -t后面的参数是需要自己填写的阿,-f gb2312,我怎么知道这个txt是gb2312的编码格式?


$ file 2005-05-24
2005-05-24: UTF-8 Unicode text

$ file ip.txt
ip.txt: ISO-8859 text, with CRLF line terminators

iso-8859  如果你知道是中文文件,在Win下写的,基本上可以用GB2312
回复 支持 反对

使用道具 举报

发表于 2005-5-28 13:25:57 | 显示全部楼层
不要搞混了,这是文件名转码,文件转码用iconv。
回复 支持 反对

使用道具 举报

发表于 2005-5-28 13:35:20 | 显示全部楼层
我以为 qhgary问的就是文件的编码呢?
我也不知道怎么判断文件名编码。

不过这个命令默认只是test,不会改写,可以先用各种编码测试,如果输出不是乱码,再加--notest。
回复 支持 反对

使用道具 举报

发表于 2005-5-28 13:41:06 | 显示全部楼层
qhgary问的就是文件的编码
回复 支持 反对

使用道具 举报

发表于 2006-1-6 22:29:15 | 显示全部楼层
不错,刚用了下
Post by bbbush
帮助文档在 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 就可以顺利打开了
回复 支持 反对

使用道具 举报

发表于 2006-1-6 22:48:28 | 显示全部楼层
Post by zhwly
我在网上下载了一些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
请问是什么编码


--nosmart
加上这个
老问题了
回复 支持 反对

使用道具 举报

发表于 2006-1-6 23:18:51 | 显示全部楼层
Post by bbbush

假如某个文档 input.txt 是从 windows 中编辑的,是 gb2312 编码。在默认编码为 utf8 的 fc3 环境中,如果使用 vi 打开,那么就会看到乱码了


not really
vi 可以自动检测
而且可以按照你指定的顺序
在.vimrc中
加入
set fileencodings=utf8,gb18030,big5
回复 支持 反对

使用道具 举报

发表于 2006-1-6 23:26:29 | 显示全部楼层
Post by xfish
可惜这个工具转换的文件xmms还是不认

写了个脚本
可以把id3tag从gbk码转到utf8
需要一个软件 id3v2

使用前,先读一读
文档写的还不全

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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