分享一个 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;
}
php
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!