ホームページ  >  記事  >  バックエンド開発  >  PHP圧縮時の中国語文字化け問題の解決方法

PHP圧縮時の中国語文字化け問題の解決方法

藏色散人
藏色散人オリジナル
2022-11-14 10:25:041948ブラウズ

PHP 圧縮された中国語文字化けの解決策: 1. 「composer require nelexa/zip」を通じて PhpZip をインストールします; 2. 「ZipFile.php」を開きます; 3. 「extractTo」メソッドを見つけて、「is_writable」を変更しますfunction 削除または削除; 4. エンコード形式を変換します。

PHP圧縮時の中国語文字化け問題の解決方法

このチュートリアルの動作環境: Windows 7 システム、PHP バージョン 8.1、Dell G3 コンピューター。

PHPで圧縮した中国語が文字化けする問題を解決するにはどうすればよいですか?

php を ZipArchive で解凍すると中国語が文字化けする問題を解決する (純粋な PHP、ZipArchive をバイパス)

php を ZipArchive で解凍すると中国語が文字化けする問題を解決する

php を使用して自動的に中国語ファイル名の圧縮パッケージを ZipArchive を使用して解凍すると、文字化けが発生します。現象は次のとおりです。基本的にネット上の回答は似たようなものなので、自分でも同じ方法でやってみてください。試しても解決できませんでした。下の図はネット上にあった解決策です。

PHP圧縮時の中国語文字化け問題の解決方法

#多くの探索を経て、最終的に解決策を見つけました。それは、ZipArchive を放棄し、他の方法を選択することです。比較のために、「PhpZip」を選択しました。利点は、純粋な PHP (拡張機能やクラスは必要ありません) です。インストールは次のとおりです。方法:

composer インストール: PHP圧縮時の中国語文字化け問題の解決方法

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 アドレスに接続されています。 「宛先は書き込み可能なディレクトリではありません。」というメッセージが表示される場合があります。この落とし穴は以前にも経験したことがあります。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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。