Linux 文件/文件名乱码问题总结

首先推荐 Ubuntu技巧总结 wiki: http://wiki.ubuntu.org.cn/UbuntuSkills#.E4.B8.AD.E6.96.87

查看编码

经过了数十年的编码混战,UTF-8以它字符覆盖广、节约字节占用(牺牲了一定性能)、且二进制安全(8bit)的特性逐渐站稳脚跟成为主流。但毕竟还有很多异教徒的存在,常见异教徒就有GB2312,GBK(别名cp936),GB18030,ISO8859-1(别名latin1)等。

这些异教徒中,GB开头的字符集格外臭名昭著。而ISO8859-1其实是扩展ASCII编码,所以多是用来背黑锅的角色,比如一些解压程序会把GBK等编码的文件名全部按ISO8859-1处理。

file 命令

file 文件名 测试结果:

$ file README
README: ASCII text

enca 命令(需要安装enca)

enca 文件名 或者可以添加语言代码参数: enca -L zh_CN 文件名 测试结果:

$ enca README
7bit ASCII characters

vim 编辑器中察看文件编码

:set fileencoding

解决文件名乱码

使用convmv(通用解)

convmv -f GBK -t UTF-8 *.txt 该方法将会测试所有的 .txt 文件名转码,如果确认无误,就在前一条命令中加上 –notest 参数执行文件名转码: convmv -f GBK -t UTF-8 --notest *.txt -f (from)是原文件名编码(一般是GBK、GB2312或GB18030), -t (to)是目标文件名编码,设为UTF-8。 另外还可以使用 -r 参数递归处理子目录。

zip压缩包

unzip -O cp936 可以指定解压编码(Ubuntu下unzip支持该参数)

解决文件内容乱码

使用iconv

iconv -f GBK -t UTF-8 gbkFile > newFile 将gbkFile由GBK编码转换为UTF-8编码,并将转码后的结果重定向输出到 newFile中。(>相当于新建newFile文件保存结果,若使用»则表示追加文件内容) 或者 iconv -f GBK -t UTF-8 gbkFile -o newFile 作用相同。 Tips: 将当前目录下所有php文件(递归子目录)由GBK转为UTF-8(覆盖原文件):

find . -type f -name *.php -print -exec iconv -f UTF-8 -t GBK {} -o {} \;

使用enca

enconv -L zh_CN -x UTF-8 gbkFile > newFile 作用同上。 -L 参数指定语言代码而非文件编码,比如zh_CN代表大陆简体,这也是enca智能的地方。 -x指定输出文件编码,加上>newFile使转码结果保存到newFile中。

使用Vim编辑器进行转码

使用命令: :set fileencoding=utf-8 将当前文件转换为utf-8编码

Table of Contents