记一次网站迁移,解决中文文件名在linux转码

1,623 阅读2分钟

linux不支持中文URL和文件名。 在IE下默认是以UTF-8的方式编码URL,向服务器发送请求,当中文出现在URL中的时候,就会被以UTF-8的方式编码,发送向服务器。这个时候服务器的字符集就会影响到WEB对URL的解码。

很多时候在其实不论是NGINX还是APACHE,问题的本质在于浏览器端请求的字符集和服务器端的字符集是否一致,当出现不一致的时候,服务器就无法找到请求的路径,从而出现404 NOT FOUND的错误。解决方案可以从以下几方面开始

1、服务器的系统字符集

在centos下可以用echo $LANG查看。可以在vi /etc/profile 中增加

export zh_CN.utf-8

export LANG=zh_CN.utf-8

然后重新启动服务器,即可生效

2、nginx的conf文件中配置的字符集

在/www/wdlinux/nginx/conf/nginx.conf中的charset设置。

3、被请求的文件路径或者文件名的字符集。

第1和第2点更改很容易,第3点,更改文件名的字符集,需要使用工具convmv才能完成

convmv 可以从http://j3e.de/linux/convmv 下载,

wget j3e.de/linux/convm…


cd convmv-1.14

make clean;

make install

如:

convmv -f gbk -t utf-8 thesis

以上表示 thesis下的所有文件的文件名由GB2312转换为UTF-8

对于文件内容的字符集转换可以使用iconv

安装 yum install convmv

语法:

convmv [options] FILE(S) … DIRECTORY(S)

主要选项:

1、-f ENCODING 指定目前文件名的编码,如-f gbk 2、-t ENCODING 指定将要转换成的编码,如-f utf-8 3、-r 递归转换目录下所有文件名 4、–list 列出所有支持的编码 5、–notest 默认是只打印转换后的效果,加这个选项才真正执行转换操作。

常用参数:

-r 递归处理子文件夹

–notest 真正进行操作,默认情况下是不对文件进行真实操作

–list 显示所有支持的编码

–unescap 可以做一下转义,比如把%20变成空格

-i 交互模式(询问每一个转换,防止误操作)

convmv 的使用方法:

convmv -f 源编码 -t 新编码 [选项] 文件名

例子:递归转换thesis目录(如下图)下的文件名编码gbk为utf-8:

convmv -f gbk -t utf-8 thesis