php의 zip_read () 함수를 사용하여 zip 파일을 읽을 때 종종 중국어 파일 이름이 차량으로 표시되는 문제가 발생합니다. 이는 주로 Zip 파일의 파일 이름이 기본적으로 CP437 인코딩이기 때문에 중국 환경은 일반적으로 UTF-8 인코딩을 사용하므로 읽기 중에 문자 세트와 차량 코드가 불일치하게됩니다.
이 기사에서는이 문제를 해결하는 방법을 자세히 설명하고 Zip_read () 를 통해 중국 파일 이름을 정상적으로 표시 할 수 있는지 확인합니다.
ZIP 형식 사양에서 파일 이름의 기본 인코딩은 IBM PC의 CP437 인코딩이지만 중국 파일 이름은 종종 GBK 또는 UTF-8을 사용하여 인코딩됩니다. PHP가 읽기시 인코딩을 올바르게 변환하지 않으면 코드가 끊어집니다.
PHP의 기본 zip_read () 함수는 자동으로 인코딩되지 않으며 수동으로 처리해야합니다.
원래 파일 이름 가져 오기 (일반적으로 CP437 인코딩)
실제 인코딩 환경에 따라 파일 이름을 CP437에서 UTF-8 또는 GBK로 변환
변환 된 파일 이름을 출력하십시오
zip 파일의 파일 이름에 UTF-8 인코딩이 표시되면 먼저 UTF-8 디코딩을 사용해야합니다. 그렇지 않으면 GBK를 사용해야합니다.
<?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>';
?>
ZIP 파일 이름이 GBK 인코딩 된 경우 MB_CONVERT_ENCODING ($ name, 'UTF-8', 'GBK')을 직접 사용할 수 있습니다.
PHP7.2+는 올바르게 인코딩 된 파일 이름을 직접 얻는 것을 지원하고 더 안정적입니다.
메모리 누출을 피하기 위해 ZIP 파일을 읽을 때 리소스 마감에주의하십시오.
<?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 문서。";
}
?>
이런 식으로 많은 코딩 문제를 피할 수 있습니다.