再次尝试在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中的应用程序..这可能是问题的根源。
有趣的是,当我在应用程序中解压缩之前命名的文件时,它的名称很好,但是,当我下载压缩文件并打开它时... ... ...
无论哪种方式,非常感谢任何可以帮助我或指导我一点的人。如果需要更多信息,请向我询问。
祝你好运
答案 0 :(得分:4)
我使用iconv("UTF-8", "CP852", $string)
解决了与中欧字符相同的问题;其中CP852是中欧的旧DOS编码。因此,对您的语言使用相应的编码可能会有所帮助(我认为它是由内部ZIP算法配置决定的,或者其他)。
答案 1 :(得分:2)
在压缩文件之前,请尝试使用url编码文件名:
答案 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。
答案 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);