현재 위치: > 최신 기사 목록> 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+는 올바르게 인코딩 된 파일 이름을 직접 얻는 것을 지원하고 더 안정적입니다.

  • 메모리 누출을 피하기 위해 ZIP 파일을 읽을 때 리소스 마감에주의하십시오.

5. ZipAchive 사용 예 (권장)

 <?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 문서。";
}
?>

이런 식으로 많은 코딩 문제를 피할 수 있습니다.