获取UTF-8文件名以使用PHP ZipArchive

时间:2014-02-27 12:27:52

标签: php utf-8

我有一个文件要添加到带有PHP的Zip,它以UTF-8编码。这是文件名:'μ汉字ääÖÅ.txt'。

现在,要将此文件保存到文件系统,我必须这样做:

$filename = "µ漢字ääÖÅ.txt";
$codepage = 'Windows-' . trim(strstr(setlocale(LC_CTYPE, 0), '.'), '.');
$encoded_filename = iconv('UTF-8', $codepage.'//IGNORE', $filename);
file_put_contents($encoded_filename, "text");

现在,当我想将文件添加到ziparchive时,我使用以下代码:

$zip = new \ZipArchive();
$zip->open('test.zip', \ZIPARCHIVE::CREATE);
$zip->addFile($encoded_filename, $encoded_filename);
$zip->close();

这导致包含文件名'ÁõõÍ+ .txt'的zip文件。如何才能正确保存?

1 个答案:

答案 0 :(得分:3)

我找到了答案(有点)。在上面的示例中,$encoded_filename已从UTF-8更改为Windows-1252编码以保存到文件系统。我不知道为什么Windows-1252在直接保存到文件系统时有效,但在使用ZipArchive保存到zip时则不行。

为了解决这个问题,我不得不再次将$ filename编码为不同的编码CP858。

示例:

$filename = "µ漢字ääÖÅ.txt";

//encode to windows-1252 to save to the filesystem
$encoded_filename = iconv("UTF-8","Windows-1252//IGNORE",$filename);
file_put_contents($encoded_filename, "text");

//put in a zip file
$zip = new \ZipArchive();
$zip->open('test.zip', \ZIPARCHIVE::CREATE);
//encode as CP858 to save into zip file
$zip->addFile($encoded_filename, iconv("UTF-8", "CP858//IGNORE", $filename));
$zip->close();

在上面的例子中,它仍然不处理文件名中的日文字符,但至少它处理的是欧洲字符,这些字符暂时必须要做。