
PHP是有解压缩类文件的,但在实际项目中,用户方使用Python脚本压缩,很容易出现中文解压乱码,导致文件内容丢失的情况,本文主要介绍PHP执行Python脚本解压缩出现的问题以及解决方法
1、压缩代码
#-*- coding: utf-8 -*-
import zipfile
import os,sys
import chardet
reload(sys);
sys.setdefaultencoding('utf8')
def zip_dir(dirname, zipfilename):
"""
| ##@函数目的: 压缩指定目录为zip文件
| ##@参数说明:dirname为指定的目录,zipfilename为压缩后的zip文件路径
| ##@返回值:无
| ##@函数逻辑:
"""
try:
zipfilePath = os.path.join(dirname, zipfilename)
#先判断有没有之前的zip包
if os.path.exists(zipfilePath):
os.remove(zipfilePath)
print('start zipfile!')
filelist = []
if os.path.isfile(dirname):
dirname = ConvertCharSet(dirname)
filelist.append(dirname)
else :
for root, dirs, files in os.walk(dirname):
for name in files:
name = ConvertCharSet(name)
print('zipfile= '+ name)
filelist.append(os.path.join(root, name))
zipfilename = ConvertCharSet(zipfilename)
zipfilename = unicode(zipfilename, 'utf-8')
zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
#zf = zipfile.ZipFile(zipfilename, "w", zipfile.ZIP_DEFLATED)
for tar in filelist:
tar = ConvertCharSet(tar)
tar = unicode(tar,'utf-8')
arcname = tar[len(dirname):]
#print arcname
zf.write(tar,arcname)
zf.close()
except Exception as ex:
print(ex)
def ConvertCharSet(str):
if str:
if isinstance(str, unicode):
return str
data = str
chr_res = chardet.detect(str)
src_enc = chr_res['encoding'].lower()
if src_enc != 'utf-8':
data = str.decode('gb18030').encode('utf-8')
return data
return ""
if __name__ == "__main__":
i = sys.argv[1].replace("'", '')
o = sys.argv[2].replace("'", '')
zip_dir(i, o)2、解压代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import zipfile,os,sys
import chardet
reload(sys)
sys.setdefaultencoding('utf-8')
def unzip(zip_name, unzip_dir):
try:
#unzip_dir = unzip_dir.decode('utf-8') # 不转码会乱码
#zip_name = zip_name.decode('utf-8') # 不转码zipfile报错
#zip_name = ConvertCharSet(zip_name)
#zip_name = unicode(zip_name, 'gbk')
#unzip_dir = ConvertCharSet(unzip_dir)
#unzip_dir = unicode(unzip_dir, 'gbk')
if not os.path.exists(unzip_dir):
os.makedirs(unzip_dir, 0777)
zfobj = zipfile.ZipFile(zip_name, 'r')
for file_name in zfobj.namelist():
file_name = file_name.replace('\\', '/')
#file_name = ConvertCharSet(file_name)
#file_name = unicode(file_name,'gbk')
print('11: '+file_name)
if file_name.endswith('/'):
#try:
# file_name = file_name.decode('utf-8')
#except UnicodeDecodeError:
# file_name = file_name.decode('gbk')
print('22: ' + file_name)
os.makedirs(os.path.join(unzip_dir, file_name), 0777)
else:
#try:
# ext_filename = os.path.join(unzip_dir, file_name.decode('utf-8'))
#except UnicodeDecodeError:
# ext_filename = os.path.join(unzip_dir, file_name.decode('gbk'))
ext_filename = os.path.join(unzip_dir, file_name)
print('33: ' + ext_filename)
ext_filedir = os.path.dirname(ext_filename)
print('44: ' + ext_filedir)
if not os.path.exists(ext_filedir):
os.makedirs(ext_filedir, 0777)
data = zfobj.read(file_name)
#print('data: '+ data)
with open(ext_filename, 'w') as f:
f.write(data)
zfobj.close()
except Exception as ex:
print('55: '+ ex)
if __name__ == "__main__":
i = sys.argv[1].replace("'", '')
o = sys.argv[2].replace("'", '')
unzip(i, o)3、执行时编码问题,如下
'ascii' codec can't encode characters in position解决方法,在脚本的头部添加如下代码
import sys
reload(sys)
sys.setdefaultencoding('utf-8')4、PHP执行Python脚本
使用exec()方法
压缩命令
/usr/bin/python zip.py '文件目录' 'zip地址'解压命令
/usr/bin/python unzip.py 'zip地址' '文件目录'易出现问题,解压时中文文件乱码,解决方法
在命令的前面添加如下代码:
指定编码格式
export LC_ALL=zh_CN.UTF-8 && 例如
export LC_ALL=zh_CN.UTF-8 && /usr/bin/python zip.py '文件目录' 'zip地址'评论
暂无评论
评论(8)