情况如图所示。
不管是纯中文文件名还是中文与字母混合的文件名,上传后都无法显示。
可能的原因:
1、WP处理UNICODE字符的相关函数存在缺陷
从反馈的结果看,WP是可以将汉字转换成UNICODE字符的,但是转换正确与否,尚未验证。
2、操作系统本身 的问题
本屋服务器操作系统系Debian 3.1 。众所周知,unix系统是ASCII编码的天下,一向对汉字这样的“双字节”符号支持不完善。
3、Apache HTTP Server 的问题
本屋的HTTP 服务软件系Apache 2.0.54。GOOLGE到的信息告诉我:Apache2在linux下有支持中文URL的缺陷。
PS. 根据APACHE 的日志文件显示,中文文件名图片会产生 HTTP 404错误,看来真的是APACHE的问题。
目前网上提供的解决方案有:
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的,在没有设定系统是此种编码时,显示为乱码。 |