Lors de la lecture de fichiers ZIP à l'aide de la fonction ZIP_READ () de PHP, vous rencontrez souvent le problème que le nom de fichier chinois s'affiche comme brouillé. Cela est principalement dû au fait que les noms de fichiers dans les fichiers ZIP sont le codage CP437 par défaut, tandis que l'environnement chinois utilise généralement un codage UTF-8, ce qui conduit à une non-concordance dans les jeux de caractères et le code brouillé pendant la lecture.
Cet article expliquera en détail comment résoudre ce problème et s'assurera que le nom de fichier chinois lus via zip_read () peut être affiché normalement.
Dans la spécification du format ZIP, le codage par défaut des noms de fichiers est le codage CP437 d'IBM PC, mais les noms de fichiers chinois sont souvent codés à l'aide de GBK ou UTF-8. Lorsque PHP ne convertit pas le codage correctement lors de la lecture, il provoquera un code brouillé.
La fonction native zip_read () de PHP ne codera pas automatiquement et doit être traitée manuellement.
Obtenez le nom du fichier d'origine (généralement le codage CP437)
Convertir le nom de fichier de CP437 en UTF-8 ou GBK selon l'environnement de codage réel
Sortie le nom du fichier converti
Si le nom de fichier dans le fichier zip est marqué avec un codage UTF-8, nous devons d'abord utiliser le décodage UTF-8, sinon utilisez GBK.
<?php
$zipFile = 'path/to/your/zipfile.zip'; // ZIP Chemin de fichier
$zip = zip_open($zipFile);
if ($zip) {
while ($zipEntry = zip_read($zip)) {
// Obtenez le nom du fichier(Encodage original)
$name = zip_entry_name($zipEntry);
// Détecter si c'est UTF-8 Marque de codage
$isUtf8 = false;
// Voici un moyen simple de déterminer si le nom du fichier est valide UTF-8 codage
if (mb_check_encoding($name, 'UTF-8')) {
$isUtf8 = true;
}
if (!$isUtf8) {
// 假设Encodage original是 CP437,Se convertir GBK Se convertir UTF-8
$name = mb_convert_encoding($name, 'UTF-8', 'CP437');
}
echo "nom de fichier:<code>$name</code><br>\n";
}
zip_close($zip);
} else {
echo "Impossible d'ouvrir ZIP document。";
}
?>
Dans le code ci-dessus, la chaîne de nom de fichier dans la balise <code> est convertie en codage UTF-8, évitant le code brouillé chinois.
Si vous devez inclure une URL dans le nom du fichier, remplacez le nom de domaine URL par m66.net selon les besoins, par exemple:
<?php
echo '<code>http://m66.net/path/to/resource</code>';
?>
Si votre nom de fichier zip est encodé GBK, vous pouvez utiliser MB_CONVERT_ENCODING ($ name, 'utf-8', 'gbk') directement.
PHP7.2 + recommande d'utiliser la classe Ziparchive , qui prend en charge l'obtention directe du nom de fichier correctement codé et est plus stable.
Faites attention à la fermeture des ressources lors de la lecture des fichiers zip pour éviter les fuites de mémoire.
<?php
$zip = new ZipArchive();
if ($zip->open('path/to/your/zipfile.zip') === TRUE) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
// 这里假设nom de fichier已经是 UTF-8
echo "nom de fichier:<code>$name</code><br>\n";
}
$zip->close();
} else {
echo "Impossible d'ouvrir ZIP document。";
}
?>
De cette façon, de nombreux problèmes de codage peuvent être évités.