在PHP + Apache中使用特殊字符压缩文件时出现问题 - 编码问题

时间:2010-12-29 17:15:56

标签: php file character-encoding

再次尝试在PHP应用程序中压缩文件时遇到编码问题。

这是交易,每当文件名包含特殊字符时,即:'eñeìá.html',我无法正确压缩它...使用php函数AddFile压缩它的结果是'e + | e + ¼+í.html'

有问题的行如下:

$ zip-> addFile($ file_to_add_path,$ file_to_add-> getFilename());

我已经尝试过使用iconv,utf8_decode / encode等,但还没有运气。我得到的更接近的是上面的例子,当使用htmlentities然后解码它们时..

我在Win XP OS中运行Xampp中的应用程序..这可能是问题的根源。

有趣的是,当我在应用程序中解压缩之前命名的文件时,它的名称很好,但是,当我下载压缩文件并打开它时... ... ...

无论哪种方式,非常感谢任何可以帮助我或指导我一点的人。如果需要更多信息,请向我询问。

祝你好运

6 个答案:

答案 0 :(得分:4)

我使用iconv("UTF-8", "CP852", $string)解决了与中欧字符相同的问题;其中CP852是中欧的旧DOS编码。因此,对您的语言使用相应的编码可能会有所帮助(我认为它是由内部ZIP算法配置决定的,或者其他)。

答案 1 :(得分:2)

在压缩文件之前,请尝试使用url编码文件名:

http://php.net/manual/en/function.urlencode.php

答案 2 :(得分:0)

您是否尝试使用其他客户端打开它,例如winRAR或其他什么?它可能是版本的差异。无论你创建它是什么,都可能支持unicode字符,而你打开它的客户端则不支持。

答案 3 :(得分:0)

使用iconv时,您是否尝试使用任何out_charset附加选项?使用以下代码,我可以创建一个存档,文件“losniños.txt”添加为“los nios.txt”

<?php
$archivePath = realpath('.\test.zip');
$archive = new ZipArchive;
$opened = $archive->open($archivePath, ZIPARCHIVE::OVERWRITE);
if ($opened === true) {
    $directory = new DirectoryIterator('.');
    foreach($directory as $fileInfo) {
        if ($fileInfo->isDot()) {
            continue;
        }

        if (preg_match('#.*\.txt$#', $fileInfo->getBasename())) {
            $cleanFilename = iconv("UTF-8", "ISO-8859-1//IGNORE", $fileInfo->getFilename());
            $archive->addFile($fileInfo->getRealPath(), $cleanFilename);
        }
    }
    $closed = $archive->close();
    if (!$closed) {
        echo "Could not create ZIP file<br/>";
    }
} else {
    echo "Could not open archive because of code {$opened}<br/>";
}

基本上,如果iconv无法找到UTF-8字符的合适替换,它只会将其删除并保留文件名的其余部分。

答案 4 :(得分:0)

使用

$clean_filename = iconv("ISO-8859-1", "CP860", $filename);

使用葡萄牙文件名解决了我的问题,根据最能捕捉到特殊字符的代码更改CP860。

https://en.wikipedia.org/wiki/Code_page

答案 5 :(得分:0)

就我而言,ZipArchive需要文件编码IBM850

您需要在压缩时将文件名转换为IBM850,而在从zip提取时将其转换回UTF8 / ISO-8859-1 / CP1252

//zipping
$relativePath = iconv('UTF-8', 'IBM850', $relativePath);
$zip->addFile($filePath, $relativePath);

//extracting
$relativePath = iconv('IBM850', 'UTF-8', $zip->getNameIndex($i));
$zip->renameIndex($i, $relativePath);
$zip->extractTo($destination, $relativePath);