用PHP如何检测一个ZIP包内的文件是在何种编码的系统下创建的


事情起源于在WIN下创建的zip放到linux下解压时,中文路径和文件名会出现乱码,于是动手写了个脚本转换zip内文件名的代码。但是,如果是在日语、韩语或者繁体字WIN系统下建立的zip,由于不知道原始编码格式,导致无法转码。
怎么解。。。

encoding php zip

火石axer 10 years, 7 months ago

LZ 的 id 看着眼熟 ... 这么多年了还在问这个等级的问题 ... 你也不容易啊你 ...

<?php
/* well ... prepare our zip file ... */
$zip = new ZipArchive;
$res = $zip->open( '/path/to/your.zip' );

/* can not open ..? are you kidding me ..? */
if ( true !== $res )
    throw new Exception( 'Can Not Open Zip File / ' . $res );

/* default value of file encoding ... */
$encoding = 'EMTPY';

/* controller ... change this if mb_detect_encoding return wrong answer ... */
$controller = null;

/* get file list ... */
for ( $i = 0; $i < $zip->numFiles; ++ $i ) {

    /* get file encoding ... */
    $encoding = mb_detect_encoding( $zip->getNameIndex( $i ), $controller );

    /* we do not need english named files ... */
    if ( 'ASCII' !== $encoding ) break;

}

/* clean table ... */
$zip->close();

/* simply output ... */
echo $encoding;

代码就是这样了 ... 根据文件名来判断系统 ...

简体中文的 windows 会返回 EUC-CN ... 繁体中文我猜测应该是 EUC-TW 或者 BIG5 ...

Linux 和 MacOS 都是 UTF-8 ... 纯英文的文件就别捣乱了 ...

pseudo answered 10 years, 7 months ago

Your Answer