此代码可以正常工作,使ZIP文件包含所需文件,除了存档中的文件名,不是英文(在这种情况下,他们是希伯来语),有奇怪的字符而不是正确的希伯来字母.
open($zip_name, ZipArchive::CREATE); foreach ($filesfordown as $filefordown) { $zip->addFile($filefordown); } $zip->close(); } header('Content-Type: application/zip'); header("Content-disposition: attachment; filename='$zip_name'"); header('Content-Length: ' . filesize($zip_name)); readfile($zip_name); ob_flush; ?>
我做了一些搜索,似乎iconv,setlocalte或mb_convert_encoding可能会有所帮助,但无论我尝试什么都行不通.
有任何想法吗?
PS作为一个附带问题,有没有办法不在zip中保留目录结构?
ETA:$_post
可能是www.domain.com/path/שלום_01.mp3的一个例子
好极了!固定!
首先是代码,然后是解释:
<?php setlocale(LC_ALL, 'he_IL.UTF-8'); $filesfordown = $_POST['GEMin']; if(empty($filesfordown)) { echo "?? ?????.. ??? ???"; } else { $zip_name = "RMW" . time() . ".zip"; $zip = new ZipArchive; $zip->open($zip_name, ZipArchive::CREATE); echo "???? ?? ??????..."; foreach ($filesfordown as $filefordown) { $zip->addFile($filefordown, iconv("UTF-8","CP862",basename($filefordown))); } $zip->close();
需要改变3件事.
验证实际的php文件是否为UTF-8.
setlocale()
需要在最后包含.UTF-8.
ZipArchive无法正确处理UTF-8.必须使用CP.希伯来语是CP862.因此,$localname
为addFile 使用额外的选项,基本上iconv("UTF-8","CODE_PAGE_REF",$localname)