作者:只喝大瓶的雪碧 | 来源:互联网 | 2014-05-28 10:53
Apache在linux下处理中文文件名的解决——utf-8、urlencode、apache、linuxApache2在linux有很臭很臭的中文问题:1。处理中文数据POST/GET都会有问题,500内部错误,error.log显示:在进行utf-8转码时出错2。中文名的文件下载有问题,404错误,error.lo
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,本站有另外一个手记给除了解决方法;
关于问题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;iconv("utf-8", "gb2312",
$FileName)
c.
Apache2无法支持空格的urlencode结果“+”,要替换成“%20”
以上步骤a、b、c必须同时存在,或者只采取步骤a也可,取消b、c,直接用中文做URL,由IE做转码和urlencode,此时空格不会翻译成“+”
(why?)
结果
1. 中文文件名的文件正常下载;
2. 保存文件的对话框显示正确;
缺点
在linux上保存的文件名是UTF-8的,在没有设定系统是此种编码时,显示为乱码