Maison >développement back-end >Problème PHP >Que faire si php zip caractères chinois tronqués

Que faire si php zip caractères chinois tronqués

藏色散人
藏色散人original
2021-09-15 11:25:193010parcourir

Solution aux caractères chinois tronqués dans php zip : 1. Ouvrez le fichier de code PHP correspondant ; 2. Utilisez le protocole d'encapsulation zip de PHP pour décompresser afin de résoudre le problème des caractères tronqués de ZipArchive.

Que faire si php zip caractères chinois tronqués

L'environnement d'exploitation de cet article : système Windows7, version PHP7.1, ordinateur DELL G3

Que dois-je faire si le zip php chinois est tronqué ?

Problème tronqué du fichier zip de décompression php

Méthode de fonctionnement officielle :

<?php
$zip = new \ZipArchive;
$zipfile = "./test.zip";
$res = $zip->open($zipfile);
$toDir = "./test";

$s = $zip->extractTo($toDir);
print_r(scandir($toDir));

Problèmes existants

Si le zip est compressé sur la plate-forme Windows, l'exécution du code ci-dessus sur le serveur Linux provoquera des caractères tronqués et le décompressera en même temps, les fichiers seront également manquants

Solution

Analyse du problème :

Les caractères tronqués de ZipArchive sont causés par un encodage incohérent. Le système de fichiers Windows est codé en gbk, tandis que les noms de fichiers dans PHP ZipArchive sont en UTF-8. codé. Si le nom du fichier dans l'archive Zip contient des caractères spéciaux tels que le chinois, il est inévitable d'utiliser PHP ZipArchive pour décompresser les caractères tronqués. La même raison s'applique lorsque les fichiers compressés ZipArchive sont tronqués ou ne peuvent pas être compressés.

Solution

N'utilisez pas la méthode ZipArchive::extractTo() intégrée pour décompresser les documents ZipArchive. Utilisez plutôt le protocole d'encapsulation zip de PHP pour décompresser ZipArchive. fichiers. Caractères tronqués.

Résolvez le code

<?php
$zip = new \ZipArchive;
$zipfile = "./test.zip";
$res = $zip->open($zipfile);

$toDir = "./test";
if(!file_exists($toDir)) {
   mkdir($toDir);
}
$docnum = $zip->numFiles;
for($i = 0; $i < $docnum; $i++) {
   $statInfo = $zip->statIndex($i);
   if($statInfo['crc'] == 0) {
       //新建目录
       mkdir($toDir.'/'.substr($statInfo['name'], 0,-1));
   } else {
       //拷贝文件
       copy('zip://'.$zipfile.'#'.$statInfo['name'], $toDir.'/'.$statInfo['name']);
   }
}

print_r(scandir($toDir));

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn