⽂件编码,⽂件或⽂件名编码格式转换
如果你需要在Linux中操作windows下的⽂件,那么你可能会经常遇到⽂件编码转换的问题。Windows中默认的⽂件格式是
送给老师的祝福语大全
GBK(gb2312),⽽Linux⼀般都是UTF-8。下⾯介绍⼀下,在Linux中如何查看⽂件的编码及如何进⾏对⽂件进⾏编码转换。
⼀,查看⽂件编码:
在Linux中查看⽂件编码可以通过以下⼏种⽅式:
1.在Vim中可以直接查看⽂件编码
:set fileencoding
即可显⽰⽂件编码格式。
如果你只是想查看其它编码格式的⽂件或者想解决⽤Vim查看⽂件乱码的问题,那么你可以在
~/.vimrc ⽂件中添加以下内容:
孟美岐黑料
set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936
这样,就可以让vim⾃动识别⽂件编码(可以⾃动识别UTF-8或者GBK编码的⽂件),其实就是依照fileencodings提供的编码列表尝试,如果没有到合适的编码,就⽤latin-1(ASCII)编码打开。
2. enca (如果你的系统中没有安装这个命令,可以⽤sudo yum install -y enca 安装 )查看⽂件编码
$ enca filename
filename: Universal transformation format 8 bits; UTF-8
CRLF line terminators
需要说明⼀点的是,enca对某些GBK编码的⽂件识别的不是很好,识别时会出现:
Unrecognized encoding
⼆,⽂件编码转换
银杏叶黄了美句1.在Vim中直接进⾏转换⽂件编码,⽐如将⼀个⽂件转换成utf-8格式
:set fileencoding=utf-8
2. iconv 转换,iconv的命令格式如下:
iconv -f encoding -t encoding inputfile
景甜背景很吓人
⽐如将⼀个UTF-8 编码的⽂件转换成GBK编码
形容时间快的成语
iconv -f GBK -t UTF-8 file1 -o file2
3. enconv 转换⽂件编码
⽐如要将⼀个GBK编码的⽂件转换成UTF-8编码,操作如下
enconv -L zh_CN -x UTF-8 filename
三,⽂件名编码转换:
从Linux往 windows拷贝⽂件或者从windows往Linux拷贝⽂件,有时会出现中⽂⽂件名乱码的情况,出现这种问题的原因是因
为,windows的⽂件名 中⽂编码默认为GBK,⽽Linux中默认⽂件名编码为UTF8,由于编码不⼀致,所以导致了⽂件名乱码的问题,解决这个问题需要对⽂件名进⾏转码。
钟汉良 写真
在Linux中专门提供了⼀种⼯具 convmv 进⾏⽂件名编码的转换,可以将⽂件名从GBK转换成UTF-8编码,或者从UTF-8转换到GBK。
⾸先看⼀下你的系统上是否安装了convmv,如果没安装的话⽤:
yum -y install convmv
安装。
下⾯看⼀下convmv的具体⽤法:
convmv -f 源编码 -t 新编码 [选项] ⽂件名
常⽤参数:
-r 递归处理⼦⽂件夹
–notest 真正进⾏操作,请注意在默认情况下是不对⽂件进⾏真实操作的,⽽只是试验。
–list 显⽰所有⽀持的编码
–unescap 可以做⼀下转义,⽐如把%20变成空格
⽐如我们有⼀个utf8编码的⽂件名,转换成GBK编码,命令如下:
convmv -f UTF-8 -t GBK –notest utf8编码的⽂件名
这样转换以后”utf8编码的⽂件名”会被转换成GBK编码(只是⽂件名编码的转换,⽂件内容不会发⽣变化)
四,vim 编码⽅式的设置
和所有的流⾏⽂本编辑器⼀样,Vim 可以很好的编辑各种字符编码的⽂件,这当然包括UCS-2、UTF-8 等流⾏的 Unicode 编码⽅式。然⽽不幸的是,和很多来⾃ Linux 世界的软件⼀样,这需要你⾃⼰动⼿设置。
Vim 有四个跟字符编码⽅式有关的选项,encoding、fileencoding、fileencodings、termencoding (这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names),它们的意义如下:
* encoding: Vim 内部使⽤的字符编码⽅式,包括 Vim 的 buffer (缓冲区)、菜单⽂本、消息⽂本等。默认是根据你的locale选择.⽤户⼿册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在.vimrc 中改变它的值才有意义。你可以⽤另外⼀种编码来编辑和保存⽂件,如你的vim的encoding为utf-8,所编辑的⽂件采⽤cp936编码,vim会 ⾃动将读⼊的⽂件转成utf-8(vim的能读懂的⽅式),⽽当你写⼊⽂件
时,⼜会⾃动转回成cp936(⽂件的保存编码).
* fileencoding: Vim 中当前编辑的⽂件的字符编码⽅式,Vim 保存⽂件时也会将⽂件保存为这种字符编码⽅式 (不管是否新⽂件都如此)。* fileencodings: Vim⾃动探测fileencoding的顺序列表,启动时会按照它所列出的字符编码⽅式逐⼀探测即将打开的⽂件的字符编码⽅式,并且将 fileencoding 设置为最终探测到的字符编码⽅式。因此最好将Unicode 编码⽅式放到这个列表的最前⾯,将拉丁语系编码⽅式latin1 放到最后⾯。
* termencoding: Vim 所⼯作的终端 (或者 Windows 的 Console 窗⼝) 的字符编码⽅式。如果vim所在的term与vim编码相同,则⽆需设置。如其不然,你可以⽤vim的termencoding选项将⾃动转换成term 的编码.这个选项在 Windows 下对我们常⽤的 GUI 模式的 gVim ⽆效,⽽对 Console 模式的Vim ⽽⾔就是 Windows 控制台的代码页,并且通常我们不需要改变它。
五,Vim 的多字符编码⼯作⽅式
1. Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单⽂本、消息⽂的字符编码⽅式。
2. 读取需要编辑的⽂件,根据 fileencodings 中列出的字符编码⽅式逐⼀探测该⽂件编码⽅式。并设置 fileencoding 为探测到的,看起来是正确的 (注1) 字符编码⽅式。
3. 对⽐ fileencoding 和 encoding 的值,若不同则调⽤ iconv 将⽂件内容转换为encoding 所描述的字符编码⽅式,并且把转换后的内容放到为此⽂件开辟的 buffer ⾥,此时我们就可以开始编辑这个⽂件了。注意,完成这⼀步动作需要调⽤外部的 iconv.dll(注2),你需要保证这个⽂件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的⽬录⾥。
4. 编辑完成后保存⽂件时,再次对⽐ fileencoding 和 encoding 的值。若不同,再次调⽤ iconv 将即将保存的 buffer 中的⽂本转换为fileencoding 所描述的字符编码⽅式,并保存到指定的⽂件中。同样,这需要调⽤ iconv.dll由于 Unicode 能够包含⼏乎所有的语⾔的字符,⽽且 Unicode 的 UTF-8 编码⽅式⼜是⾮常具有性价⽐的编码⽅式 (空间消耗⽐ UCS-2 ⼩),因此建议 encoding 的值设置为utf-8。这么做的另⼀个理由是 encoding 设置为 utf-8 时,Vim ⾃动探测⽂件的编码⽅式会更准确 (或许这个理由才是主要的 ;)。我们在中⽂Windows ⾥编辑的⽂件,为了兼顾与其他软件的兼容性,⽂件编码还是设置为 GB2312/GBK ⽐较合适,因此 fileencoding 建议设置为chinese (chinese 是个别名,在 Unix ⾥表⽰ gb2312,在 Windows ⾥表⽰cp936,也就是 GBK 的代码页)。