Linux下PHP调用7za压缩时出现乱码的解决方法

这个问题折腾了很久,面临的问题总结出来就是“Windows下的文件编码和LINUX不一样,中文系统为GB,LINUX为UTF-8编码”。

使用7za来压缩和解压文件,可以有效的解决Windows和Linux文件传输出现乱码的问题。

俺的某套程序需要实现批量打包下载的功能,也使用了7z来进行压缩,发现PHP运行在Apache默认的语言下,会造成Apache+PHP+7za生成的文件乱码。

经过一段时间的研究,发现可以修改配置文件,修改Apache的运行环境,以实现Locale编码的修改

修改/etc/sysconfig/httpd

[shell]
#
# By default, the httpd process is started in the C locale; to
# change the locale in which the server runs, the HTTPD_LANG
# variable can be set.
#
HTTPD_LANG=C
[/shell]
改成
[shell]
#
# By default, the httpd process is started in the C locale; to
# change the locale in which the server runs, the HTTPD_LANG
# variable can be set.
#
HTTPD_LANG=zh_CN.UTF-8
[/shell]

其中,zh_CN.UTF-8可以改成zh_CN.GB2312等编码。

运行结果:
为了测试效果,可以打印出WEB运行用户的locale
[php]
<?php
print_r(`whoami`);
print_r(`locale`);
print_r(`/usr/bin/7za -?`);
[/php]

修改以前的结果

[shell]
apache

LANG:LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=

7-Zip (A) 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
p7zip Version 9.20 (locale=C,Utf16=off,HugeFiles=on,4 CPUs)
[/shell]

修改以后的结果:
[shell]
apache
LANG=zh_CN.gb2312
LC_CTYPE="zh_CN.gb2312"
LC_NUMERIC="zh_CN.gb2312"
LC_TIME="zh_CN.gb2312"
LC_COLLATE="zh_CN.gb2312"
LC_MONETARY="zh_CN.gb2312"
LC_MESSAGES="zh_CN.gb2312"
LC_PAPER="zh_CN.gb2312"
LC_NAME="zh_CN.gb2312"
LC_ADDRESS="zh_CN.gb2312"
LC_TELEPHONE="zh_CN.gb2312"
LC_MEASUREMENT="zh_CN.gb2312"
LC_IDENTIFICATION="zh_CN.gb2312"
LC_ALL=

7-Zip (A) 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
p7zip Version 9.20 (locale=zh_CN.gb2312,Utf16=on,HugeFiles=on,4 CPUs)
[/shell]

httpd默认使用C作为locale,而不是象以前一样是用root的locale作为locale,可以通过修改/etc/sysconfig/httpd里的环境变量HTTPD_LANG来自定义。