現在の位置: ホーム> 最新記事一覧> zip_read()を使用してzipファイルを読み取るときに、中国語のエンコードの問題を解決する方法は?

zip_read()を使用してzipファイルを読み取るときに、中国語のエンコードの問題を解決する方法は?

M66 2025-06-12

phpのzip_read()関数を使用してzipファイルを読み取ると、中国のファイル名が文字化けとして表示される問題に遭遇することがよくあります。これは主に、ZIPファイルのファイル名がデフォルトでCP437エンコードである一方、中国の環境は通常UTF-8エンコードを使用しているためです。

この記事では、この問題を解決する方法を詳細に説明し、 zip_read()を介して中国のファイル名が正常に表示できるようにします。

1。文字化けコードの理由

ZIP形式の仕様では、ファイル名のデフォルトエンコードはIBM PCのCP437エンコードですが、中国のファイル名はGBKまたはUTF-8を使用してエンコードされることがよくあります。 PHPが読み取り中にエンコードを正しく変換しない場合、それは文字化けのコードを引き起こします。

PHPのネイティブZIP_READ()関数は自動的にエンコードすることはなく、手動で処理する必要はありません。

2。ソリューション

  • 元のファイル名を取得します(通常はCP437エンコーディング)

  • 実際のエンコード環境に従って、ファイル名をCP437からUTF-8またはGBKに変換します

  • 変換されたファイル名を出力します

ZIPファイルのファイル名にUTF-8エンコードがマークされている場合、最初にUTF-8デコードを使用する必要があります。そうでなければGBKを使用します。

3。コードの例

<?php
$zipFile = 'path/to/your/zipfile.zip'; // ZIP ファイルパス

$zip = zip_open($zipFile);
if ($zip) {
    while ($zipEntry = zip_read($zip)) {
        // ファイル名を取得します(オリジナルエンコーディング)
        $name = zip_entry_name($zipEntry);

        // それがあるかどうかを検出します UTF-8 エンコードマーク
        $isUtf8 = false;
        // ファイル名が有効かどうかを判断する簡単な方法は次のとおりです UTF-8 コーディング
        if (mb_check_encoding($name, 'UTF-8')) {
            $isUtf8 = true;
        }

        if (!$isUtf8) {
            // 假设オリジナルエンコーディング是 CP437,に変換します GBK に変換します UTF-8
            $name = mb_convert_encoding($name, 'UTF-8', 'CP437');
        }

        echo "ファイル名:<code>$name</code><br>\n";
    }
    zip_close($zip);
} else {
    echo "開くことができません ZIP 書類。";
}
?>

上記のコードでは、 <code>タグのファイル名文字列がUTF-8エンコーディングに変換され、中国語の文字化けコードが避けられます。

ファイル名にURLを含める必要がある場合は、必要に応じてURLドメイン名をM66.netに置き換えます。たとえば

<?php
echo '<code>http://m66.net/path/to/resource</code>';
?>

4。その他の予防策

  • zipファイル名がGBKエンコードされている場合、 mb_convert_encoding($ name、 'utf-8'、 'gbk')を直接使用できます。

  • php7.2+は、正しくエンコードされたファイル名を直接取得することをサポートし、より安定しているZiparchiveクラスを使用することをお勧めします。

  • ZIPファイルを読み取るときは、メモリの漏れを避けるために、リソースの閉鎖に注意してください。

5。Ziparchiveの使用例(推奨)

 <?php
$zip = new ZipArchive();
if ($zip->open('path/to/your/zipfile.zip') === TRUE) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $name = $zip->getNameIndex($i);

        // 这里假设ファイル名已经是 UTF-8
        echo "ファイル名:<code>$name</code><br>\n";
    }
    $zip->close();
} else {
    echo "開くことができません ZIP 書類。";
}
?>

これにより、多くのコーディングの問題を回避できます。