近日,有同事遇到一个奇怪问题:在开发环境,apache能正常支持中文文件下载,但切换到测试环境就404错误,找不文件,两个环境都是linux系统。我起先怀疑的是linux下需要对apache进行配置,以支持中文名。但研究了一下两个环境的配置,开发环境除apache版本高了点外,并没有其他特殊配置。所以怀疑版本问题,又把开发环境的apache及配置同步到了测试环境,重启依然无效。
折腾半天,基本上可以判定这个问题应该与apache配置和版本无关了。
网上google了一把,有很多关于mod_encoding.so模块实现中文支持和IE浏览器中取消”发送UTF-8 URL”的设置,考虑到开发环境并没有加入额外的module,也没设置IE选项,所以也没在意这些方案,况且这两个方案也不便于生产环境布署或实际应用。
后来,又请教了SA和其他同学,还是没有结果。只能继续摸索,查找原因。通过两个环境的反复比较,终于发现了问题所在:
通过 locale 查看了系统的字符集,开发机上是en_US.UTF-8,而测试机上是zh_CN.GBK;开发机上显示的中文文件名是乱码,测试机上显示正常,但反而显示为乱码的开发机上能被下载,而测试机上显示正常的文件不能被下载。后来,将测试环境的字符集也设为:en_US.UTF-8,并从svn重新迁出了中文名的文件,发现确实可以被读取到。
分析一下原因,ie客户是发送”UTF-8 URL”到apache,apache以utf-8编码的文件名查找相关目录下的文件,如果此时中文文件是以GBK或其他字符集保存时,就无法找到匹配的文件。所以网上说的IE浏览器中取消”发送UTF-8 URL”的设置就有效的说法就可以解释了。
结论:linux环境下apache中文文件下载支持与该文件的字符集有关,只要创建或从svn迁出中文文件文件时,linux系统为UTF-8的字符集,或中文文件名以UTF-8编码的文件,即能被apache正确读取。网上有资料说,apache 2.x 以上版本即支持中文文件名,虽然未经验证,但至少可以肯定apache 2.0.55、2.0.63是没有问题的。
Linux系统下设置系统字符集
查看系统已安装的字符集
命令:
locale -a 查看本地字符集
locale -m 查看所有支持的字符集
执行命令:
# locale -a
显示结果为
ur_PK.utf8 uz_UZ uz_UZ@cyrillic uz_UZ.iso88591 uz_UZ.utf8@cyrillic ve_ZA ve_ZA.utf8 vi_VN vi_VN.tcvn vi_VN.utf8 xh_ZA.utf8 yi_US yi_US.cp1255 yi_US.utf8 zh_CN zh_CN.gb18030 zh_CN.gb2312 zh_CN.gbk zh_CN.utf8 zh_HK zh_HK.big5hkscs zh_HK.utf8 zh_SG zh_SG.gb2312 zh_SG.gbk zh_SG.utf8 zh_TW zh_TW.big5 zh_TW.euctw zh_TW.utf8 zu_ZA zu_ZA.iso88591 zu_ZA.utf8
执行命令
# locale –m
显示结果为
ANSI_X3.110-1983 ANSI_X3.4-1968 ARMSCII-8 ASMO_449 BIG5 BIG5-HKSCS BS_4730 BS_VIEWDATA CP10007 CP1125 CP1250 CP1251 CP1252 CP1253 CP1254 CP1255 CP1256 CP1257 CP1258 CP737 CP775 CP949 CSA_Z243.4-1985-1 CSA_Z243.4-1985-2 CSA_Z243.4-1985-GR CSN_369103 CWI DEC-MCS DIN_66003 DS_2089 EBCDIC-AT-DE EBCDIC-AT-DE-A EBCDIC-CA-FR EBCDIC-DK-NO EBCDIC-DK-NO-A EBCDIC-ES EBCDIC-ES-A EBCDIC-ES-S EBCDIC-FI-SE EBCDIC-FI-SE-A EBCDIC-FR EBCDIC-IS-FRISS EBCDIC-IT EBCDIC-PT EBCDIC-UK EBCDIC-US ECMA-CYRILLIC ES ES2 EUC-JISX0213 EUC-JP EUC-JP-MS EUC-KR EUC-TW GB18030 GB2312 GBK GB_1988-80 GEORGIAN-ACADEMY GEORGIAN-PS GOST_19768-74 GREEK-CCITT GREEK7 GREEK7-OLD HP-ROMAN8 IBM037 IBM038 IBM1004 IBM1026 IBM1047 IBM1124 IBM1129 IBM1132 IBM1133 IBM1160 IBM1161 IBM1162 IBM1163 IBM1164 IBM256 IBM273 IBM274 IBM275 IBM277 IBM278 IBM280 IBM281 IBM284 IBM285 IBM290 IBM297 IBM420 IBM423 IBM424 IBM437 IBM500 IBM850 IBM851 IBM852 IBM855 IBM856 IBM857 IBM860 IBM861 IBM862 IBM863 IBM864 IBM865 IBM866 IBM866NAV IBM868 IBM869 IBM870 IBM871 IBM874 IBM875 IBM880 IBM891 IBM903 IBM904 IBM905 IBM918 IBM922 IEC_P27-1 INIS INIS-8 INIS-CYRILLIC INVARIANT ISIRI-3342 ISO-8859-1 ISO-8859-10 ISO-8859-11 ISO-8859-13 ISO-8859-14 ISO-8859-15 ISO-8859-16 ISO-8859-2 ISO-8859-3 ISO-8859-4 ISO-8859-5 ISO-8859-6 ISO-8859-7 ISO-8859-8 ISO-8859-9 ISO-IR-197 ISO-IR-209 ISO-IR-90 ISO_10367-BOX ISO_10646 ISO_11548-1 ISO_2033-1983 ISO_5427 ISO_5427-EXT ISO_5428 ISO_646.BASIC ISO_646.IRV ISO_6937 ISO_6937-2-25 ISO_6937-2-ADD ISO_8859-1,GL ISO_8859-SUPP IT JIS_C6220-1969-JP JIS_C6220-1969-RO JIS_C6229-1984-A JIS_C6229-1984-B JIS_C6229-1984-B-ADD JIS_C6229-1984-HAND JIS_C6229-1984-HAND-ADD JIS_C6229-1984-KANA JIS_X0201 JOHAB JUS_I.B1.002 JUS_I.B1.003-MAC JUS_I.B1.003-SERB KOI-8 KOI8-R KOI8-T KOI8-U KSC5636 LATIN-GREEK LATIN-GREEK-1 MAC-CYRILLIC MAC-IS MAC-SAMI MAC-UK MACINTOSH MIK MSZ_7795.3 NATS-DANO NATS-DANO-ADD NATS-SEFI NATS-SEFI-ADD NC_NC00-10 NEXTSTEP NF_Z_62-010 NF_Z_62-010_(1973) NF_Z_62-010_1973 NS_4551-1 NS_4551-2 PT PT154 PT2 RK1048 SAMI SAMI-WS2 SEN_850200_B SEN_850200_C SHIFT_JIS SHIFT_JISX0213 T.101-G2 T.61-7BIT T.61-8BIT TCVN5712-1 TIS-620 TSCII UTF-8 VIDEOTEX-SUPPL VISCII WIN-SAMI-2 WINDOWS-31J
设置系统默认字符集
1〉查看系统配置参数
# export
修改系统配置参数
2>临时修改
# export 参数名=参数值
例如:
export LANG="zh_CN.GB18030"
注意:export修改参数仅限于当前登陆状态时有效,重启后失效,需要写入/etx/profile文件。
3〉永久修改
修改profile文件:
所有用户(不安全)
修 改/etc/profile(对所有用户都是有效的)
#vi /etc/profile
在里面加入:
export LANG="zh_CN.GB18030"
What’s up, it is understandable paragraph along with this YouTube video; I can imagine that one can not understand this trouble-free piece of writing having with video presentation.