php 读取压缩包文件名乱码,分享一个 PHP 读取 ZIP 压缩文件的函数,自带转换文件名称编码格式,支持日韩俄等多国语言,防止乱码...

任何程序语言处理多国语言文字都是一个比较麻烦的事情,PHP也不例外。

ZIP文件是一个常用的压缩文件格式,PHP 自带有 ZipArchive 类用来操作ZIP文件,但 PHP 本身默认是以 UTF-8 编码格式来处理文本的,所以不可避免会在处理其他编码的文本时出现乱码。

这里分享一个PHP读取ZIP压缩文件的函数,自带转换文件名称编码格式,支持日韩俄等多国语言,防止读取乱码。

这个函数的特点就是会自动转换其他编码格式的内容为 UTF-8,同时也可以用回调函数来接收每一项内容,方便处理。

/**

* 获取ZIP压缩文件内容列表

* @param [string] $file ZIP文件路径

* @param [string] $dir 需要列出的文件夹

* @param [bool] $subdir 是否列出子文件夹内容

* @param [callable] $callback 列出每一项时的回调函数

* @return [Array]

*/

function zip_list_content($file, $dir=null, $subdir=true, $callback=null) {

$zip = new ZipArchive();

if (!$zip->open($file)) {

return false;

}

$count = $zip->numFiles;

if ($dir) $dir = trim($dir, '/');

if (is_callable($callback) $_callback = true; else $_callback = false;

$results = [];

for ($i = 0; $i < $count; $i++) {

$entry = $zip->statIndex($i, ZipArchive::FL_ENC_RAW);

$entry['name'] = rtrim(str_replace('\\', '/', $entry['name']), '/');

$encoding = mb_detect_encoding($entry['name'], array('Shift_JIS','EUC_JP','EUC_KR','KOI8-R','ASCII','GB2312','GBK','BIG5','UTF-8'));

$filename = iconv($encoding, 'UTF-8', $entry['name']);

$filename = $filename ?: $entry['name'];

$size = $entry['size'];

$comp_size = $entry['comp_size'];

$mtime = $entry['mtime'];

$crc = $entry['crc'];

$is_dir = ($crc == 0);

$path = '/' . $filename;

if ($dir and (stripos($filename, $dir) !== 0 or strtolower($filename) == strtolower($dir))) continue;

$_names = explode('/', $filename);

$_idx = count($_names)-1;

if (!$subdir and $_idx != count(explode('/', $dir))) continue;

$name = $_names[$_idx];

$index = $i;

//$data = $zip->getFromIndex($i);

$entry = compact('name', 'path', 'size', 'comp_size', 'mtime', 'crc', 'index', 'is_dir');

$results[] = $entry;

if ($_callback) @call_user_func($callback, $entry, $index, $zip);

}

$zip->close();

return $results;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值