php壓縮中文亂碼的解決方法:1、透過「composer require nelexa/zip」安裝PhpZip;2、開啟「ZipFile.php」;3、找到「extractTo」方法,將「is_writable」函數改掉或去掉;4、轉換一下編碼格式即可。
本教學操作環境:windows7系統、PHP8.1版、Dell G3電腦。
怎麼解決php壓縮中文亂碼問題?
解決php使用ZipArchive解壓縮時中文亂碼問題(純php,繞開ZipArchive)
解決php使用ZipArchive解壓縮時中文亂碼問題
使用php自帶的ZipArchive來解壓縮帶中文文件名壓縮包時會造成亂碼,現像如下:
網上查閱基本上給出的答案大同小異,自己照著同樣的方法試了都無法解決,下圖是網路上給出的方案:
經過摸索終於找到了解決方案,那就是棄用ZipArchive,選擇其他的途徑,經過比較我選擇了“PhpZip”,優點是:純php(不需要擴充功能和類別),以下介紹安裝方法:
composer安裝:
composer require nelexa/zip
如果選擇版本的話:composer require nelexa /zip:^3.0 (3.0版本號)
使用方法:
//解压文件 $fileAddess = "压缩包地址"; $toDir = "解压目录"; $zipFile = new \PhpZip\ZipFile(); $zipFile->openFile($fileAddess) // open archive from file ->extractTo($toDir); // extract files to the specified directory $zipFile->close();
註解:(**如果安裝好使用正常請忽略下面的註解內容**)
1.我的壓縮包放在共享盤裡面連接的是smb地址,可能會出現報錯:"Destination is not writable directory",這個坑已經踩過:打開ZipFile.php這個文件,找到“extractTo”方法,將「is_writable」函數改掉,或去掉,然後再轉換編碼格式! ,以下有註解的是我修改的內容!
/** * Extract the archive contents * * Extract the complete archive or the given files to the specified destination. * * @param string $destination Location where to extract the files. * @param array|string|null $entries The entries to extract. It accepts either * a single entry name or an array of names. * @return ZipFile * @throws ZipException */ public function extractTo($destination, $entries = null) { if (!file_exists($destination)) { throw new ZipException("Destination " . $destination . " not found"); } if (!is_dir($destination)) { throw new ZipException("Destination is not directory"); } $is_really_writable = $this->is_really_writable($destination); if (!$is_really_writable) { throw new ZipException("Destination is not writable directory"); } /** * @var ZipEntry[] $zipEntries */ if (!empty($entries)) { if (is_string($entries)) { $entries = (array)$entries; } if (is_array($entries)) { $entries = array_unique($entries); $flipEntries = array_flip($entries); $zipEntries = array_filter( $this->centralDirectory->getEntries(), function ($zipEntry) use ($flipEntries) { /** * @var ZipEntry $zipEntry */ return isset($flipEntries[$zipEntry->getName()]); } ); } } else { $zipEntries = $this->centralDirectory->getEntries(); } foreach ($zipEntries as $entry) { /******************************王天佑添加的逻辑start************************************/ header("Content-type:text/html;charset=bgk"); $entry_getName = iconv('GB2312', 'UTF-8//ignore',$entry->getName()); //header("Content-type:text/html;charset=utf-8"); /******************************王天佑添加的逻辑start************************************/ $file = $destination . DIRECTORY_SEPARATOR . $entry_getName; if ($entry->isDirectory()) { if (!is_dir($file)) { if (!mkdir($file, 0755, true)) { throw new ZipException("Can not create dir " . $file); } chmod($file, 0755); touch($file, $entry->getTime()); } continue; } $dir = dirname($file); if (!is_dir($dir)) { if (!mkdir($dir, 0755, true)) { throw new ZipException("Can not create dir " . $dir); } chmod($dir, 0755); touch($dir, $entry->getTime()); } if (file_put_contents($file, $entry->getEntryContent()) === false) { throw new ZipException('Can not extract file ' . $entry_getName); } touch($file, $entry->getTime()); } return $this; } //王天佑加的新逻辑,判断目录是否可写 public function is_really_writable($file){ if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) { return is_writable($file); } if (is_dir($file)) { $file = rtrim($file, '/') . '/' . md5(mt_rand(1,100) . mt_rand(1,100)); if (($fp = @fopen($file, "w+")) === FALSE) { return FALSE; } fclose($fp); @chmod($file, 0777); @unlink($file); } elseif (!is_file($file) OR ($fp = @fopen($file, "r+")) === FALSE) { fclose($fp); return FALSE; } return TRUE; }
推薦學習:《PHP影片教學》
以上是怎麼解決php壓縮中文亂碼問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!