处理Linux中文文件名乱码问题

前几天使用FlashFXP查看到服务器上有几个中文的目录,但是点击不进去,中文文件名的文件也下载不下来,,新上传的中文文件名却正常。怀疑是编码问题引起的。早之前也试过在操作系统默认字符集没有更改前,用FTP上传的文件名在SecureCRT登录上去查看的就是乱码,起初以为是SecureCRT字体设置的有问题,但是使用同一款字体登录了公司的另一台CentOS服务器却很正常。

用locale命令看到

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

尝试过把/ect/sysconfig/i18n里的字符集更改为GB18030。

LANG="zh_CN.GB18030"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="lat0-sun16"

结果还是不正常,ftp点击原来的中文文件名进不去目录。

在RHEL5中对应的文件是/usr/lib/locale/zh_CN.gb18030
/etc/sysconfig/i18n 这里存放的是系统的区域语言设置
第一行 表明你当前系统的语言环境变量设置 ,这里是 zh_CN.GB18030
第二行 表明系统预置了那些语言支持 ,不在项目中的语言不能正常显示
第三行 定义控制台终端字体,你文本登录的时候显示的字体就是这个 latarcyrheb-sun16
注:
I18N 是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软件的“国际化”.
I18N支持多种语言,不过同一时间只能是英文和一种选定的语言,例如英文+中文、英文+德文、英文+韩文等等;
原来的:
LANG=”zh_CN.UTF-8″
SUPPORTED=”zh_CN.UTF-8:zh_CN:zh”
SYSFONT=”latarcyrheb-sun16″

基本上确定了问题是因为windows使用提GBK编码直接上传导致的。无意中让我搜索到这篇文章《从windows ftp上传utf-8编码的linux,中文文件名乱码问题解决办法

原文内容:

windows缺省字符集是GBK,在ftp上传到linux文件时,中文文件名总是显示乱码,原因是此linux字符集为utf-8,无论是ftp还是scp,都不能自动解决编码不一致问题。
经查找,解决办法如下:
在linux下安装convmv命令,采用

convmv -f gbk -t utf-8 –notest -r ./

即可。
注意:为了以防上传到linux上的文件确实是gbk的乱码,可以先别加 [–notest],这样先将改名名的命令显示到控制台,正确后再添加 –notest参数。
–notest 参数为 正式执行改名动作。
-r 为递归子目录
./ 这个是你要修改文件的目录位置。
另外,打包时最好别用zip格式,windows上压缩后,再在linux解压,中文名不是gbk编码了(我测试过了)。保险起见请用tar打包上传。

可是发现我的RHEL里没有这个命令,应该是要安装一个rpm包。

http://rpm.pbone.net/index.php3 这是一个搜索rpm包的网站,终于让我找到了一个适用RHEL 5 的rpm安装包。

wget http://dag.wieers.com/redhat/el5/en/x86_64/extras/RPMS/convmv-1.15-1.el5.rfx.noarch.rpm
rpm -ivh convmv-1.15-1.el5.rfx.noarch.rpm

安装完之后再执行上面所说的convmv指令,成功转换文件名编码,FTP操作正常,SecureCRT查看也正常。

下面看一下convmv的具体用法:

convmv -f 源编码 -t 新编码 [选项] 文件名
常用参数:
-r 递归处理子文件夹
–notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
–list 显示所有支持的编码
–unescap 可以做一下转义,比如把 变成空格
比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下:
convmv -f UTF-8 -t GBK –notest utf8编码的文件名
这样转换以后”utf8编码的文件名”会被转换成GBK编码(只是文件名编码的转换,文件内容不会发生变化)

发布者