热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux中Apache使用中文文件名的方法

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的,在没有设定系统是此种编码时,显示为乱码


推荐阅读
author-avatar
只喝大瓶的雪碧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有