在PHP中将解压的Zip文件重命名为其他语言时出错。

14

我使用PHP ZipArchive类来解压缩.zip文件,在英语上运作良好,但在我的本地语言(泰语)中引起问题。

我使用iconv('utf-8', 'windows-874', $zip->getNameIndex($i))将utf-8转换为泰语。它能够用于转换文件夹/文件的名称,但无法用于已解压缩的.zip文件并导致以下错误:

iconv():在输入字符串中检测到非法字符

请问有人能告诉我这里的问题是什么吗?

我的PHP代码

$file = iconv('utf-8', 'windows-874', $_GET['File']);
$path = iconv('utf-8', 'windows-874', $_GET['Path']);

$zip = new ZipArchive;
if ($zip->open($file) === TRUE) {
    // convert to Thai language
    for($i = 0; $i < $zip->numFiles; $i++) {
        $name = $zip->getNameIndex($i);
        //echo iconv("charset zip file", "windows-874", $name);
        //$zip->extractTo($path,$name); -> this problem
    }
    $zip->close();
    echo json_encode('unZip!!!');
} else {
    echo json_encode('Failed');
}

我解压缩文件后,文件名并不是我设置的那个。 After I extract the zipped file, The file's name is not the one I set for it.

这是我尝试设置的名称: This is name i try to set :

这是我的压缩文件:

https://www.dropbox.com/s/9f4j04lkvsyuy63/test.zip?dl=0

更新
我尝试在Windows XP中解压缩该文件,结果正常,但在Windows 7中则不行。


1
你用于实际提取内容的代码在哪里?你能上传一个最小化的示例zip文件,以便在添加用于提取其内容的代码后,在某个地方显示出错误吗? - MatsLindh
2
但是使用utf8处理“THAI”不是更好吗?为什么要转换成windows-874呢? - Guilherme Nascimento
您没有提供足够的信息,很可能这不是语言直接导致的问题,听起来像是您的文件不是有效的zip格式,这在php中经常发生,因为zip二进制文件中有一个额外的位,等等。您是通过服务器从网页下载吗?在Linux上运行以下命令:zip -T filename.zip 并告诉我们输出结果。 - Neo
我偶然发现了一个项目,可以解决有关文件编码名称的许多问题。我认为这个可能会有所帮助。 - fsacer
抱歉,我非常忙,所以我将文件名和目录更改为英文。非常感谢您的帮助。 - Veerapat Boonvanich
显示剩余2条评论
1个回答

1

如果您需要帮助,可以尝试使用mb_detect_encoding() - 请参见以下代码。如果路径也有问题,则可能需要对此代码进行扩展。如果需要执行循环操作,请使用循环。

$file = iconv('utf-8', 'windows-874', $_GET['File']);
$path = iconv('utf-8', 'windows-874', $_GET['Path']);

$zip = new ZipArchive;
if ($zip->open($file) === TRUE) {
    // convert to Thai language
    for($i = 0; $i < $zip->numFiles; $i++) {
        $name = $zip->getNameIndex($i);
        $order = mb_detect_order();
        $encoding = mb_detect_encoding($name, $order, true);
        if (FALSE === $encoding) {
             throw new UnexpectedValueException(
                sprintf(
                    'Unable to detect input encoding with mb_detect_encoding, order was: %s'
                , print_r($order, true)
                )
             );
        } else {
            $encoding = mb_detect_encoding($name);
            $stringUtf8 = iconv($encoding, 'UTF-8//IGNORE', $name);
            $zip->extractTo($path,$stringUtf8);
        }  
    }
    $zip->close();
    echo json_encode('unZip!!!');
} else {
    echo json_encode('Failed');
}

谢谢你的代码,但是它不起作用,我改成了英文。这比泰语文件名更容易。非常感谢。 - Veerapat Boonvanich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接