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

Que faire si php ziparchive contient des caractères chinois tronqués ?

藏色散人
Libérer: 2023-03-10 06:56:01
original
2260 Les gens l'ont consulté

La solution aux caractères chinois tronqués dans php ziparchive : ouvrez d'abord le package compressé pour transcoder les noms de fichiers et les répertoires internes ; puis fermez le package compressé après le transcodage et rouvrez-le pour décompresser.

Que faire si php ziparchive contient des caractères chinois tronqués ?

L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur DELL G3

Solution aux caractères chinois tronqués lors de la décompression de PHP à l'aide de ZipArchive Problème

L'utilisation de ZipArchive de PHP pour décompresser des packages compressés avec des noms de fichiers chinois entraînera des caractères tronqués :

Structure originale :

.

 

Code de décompression :

$zip = new \ZipArchive();
$res = $zip->open('./钱学森班.zip');
if ($res !== true){    
throw new \Exception('打开压缩包失败');
}$zip->extractTo('./cache');
$zip->close();
Copier après la connexion

Après décompression :

 

Raison

Fenêtres par défaut, encodage mac lors de la compression du package Pour le chinois simplifié, aucune conversion de fichier n'a été effectuée lors de la décompression, ce qui a entraîné des résultats de décompression incohérents avec les attentes

Solution

Après avoir ouvert le package compressé, transcodez d'abord le nom du fichier interne et le répertoire, et devez le fermer après le transcodage. Compressez le package et rouvrez-le pour décompresser

comme suit :

$zipName = './钱学森班.zip';
$zip = new \ZipArchive();
$res = $zip->open($zipName);
if ($res !== true){
    throw new \Exception('打开压缩包失败');
}

// 加入此段↓
$fileNum = $zip->numFiles;
for ($i = 0; $i < $fileNum; $i++) {
    $statInfo = $zip->statIndex($i, ZipArchive::FL_ENC_RAW);
    $zip->renameIndex($i, iconv(&#39;GBK&#39;, &#39;utf-8//IGNORE&#39;, $statInfo[&#39;name&#39;]));
}
$zip->close();
$zip->open($zipName);
// 截至↑

$zip->extractTo($extractTo);
$zip->close();
Copier après la connexion

Notes

  • Parce que le fichier du package compressé d'origine est modifié après le transcodage, ne peut pas être répété Transcodage , si vous ne voulez pas affecter le fichier original, vous devez d'abord copier (l'extension php-zip lit le flux du fichier par elle-même , aucune copie n'est requise)
  • Utilisez mb_detect_encoding avant la conversion Le jugement d'encodage renvoie toujours UTF-8

Étude recommandée : "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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal