Apache在linux下处理中文文件名的解决——utf-8、urlencode、apache、linux

Apache2在linux有很臭很臭的中文问题:

1。处理中文数据 POST/GET 都会有问题,500内部错误,error.log显示:在进行utf-8转码时出错
2。中文名的文件下载有问题,404错误,error.log显示:\xaa\xbb\xcc...

关于问题1,本站有另外一个手记给除了解决方法:http://mshtyu.dns0755.net/blogview.asp?logID=53&cateID=9;

关于问题2,网上有很多人碰到,apache2的bugzilla也有,可能跟问题1是一个原因。目前网上提供的解决方案有:

a. 增加 AddDefaultCharset GB2312 —— 经测试无效,这个只影响页面输出的缺省编码,但是页面应该是自己指定编码的,由Server指定不符合逻辑,尤其存在Virtual Server的情况下;

b. 取消IE始终使用UTF-8传送URL —— 经测试有效,但是又不能强迫所有客户端修改IE配置,而且是IE的缺省配置

问题原因:

a. 文件上传时,apache的上传模块传递的文件名是不经过编码的,即使用ISO8859-1编码,并以此编码的文件名保存之;
b. 如果由apache自己生成该文件的URL,则中文文件名是经过urlencode处理过的,此时下载正常,但是在弹出对话框的保存文件名中中文出现乱码;
c. 如果由程序用此中文名直接生成URL,由于IE使用UTF-8传递URL,因此中文会首先被转成UTF-8,然后经urlencode处理;Apache受到后还原为UTF-8的文件名,无法找到用ISO8859-1编码的对应的文件;

解决方法:

a. 文件上传后保存时一般由cgi完成处理,因此在此时保存为UTF-8编码的文件名;例如在php中采用:

CODE:
copy($tmpFile, iconv("gb2312", "utf-8", $FileName));

前提是php支持iconv;

b. 生成URL时,也采用此种方法,用iconv转码后再urlencode;

c. Apache2无法支持空格的urlencode结果“+”,要替换成“%20”

以上步骤a、b、c必须同时存在,或者只采取步骤a也可,取消b、c,直接用中文做URL,由IE做转码和urlencode,此时空格不会翻译成“+” (why?)

结果

1. 中文文件名的文件正常下载;
2. 保存文件的对话框显示正确;

缺点

在linux上保存的文件名是UTF-8的,在没有设定系统是此种编码时,显示为乱码