簡體   English   中英

PHP ZipArchive非英語文件名返回存檔中的時髦文件名

[英]PHP ZipArchive non-English filenames return funky filenames within archive

此代碼可以正常工作,以使帶有所需文件的ZIP文件(存檔中的文件名不是英語(在這種情況下為希伯來語))具有奇怪的字符而不是適當的希伯來字母。

<?php
$filesfordown = $_POST['GEMin'];
    if(empty($filesfordown)) 
    {
        echo "No files were seleceted for download.";
    } 
    else 
    {
$zip_name = "RMW." . time() . ".zip";
$zip = new ZipArchive;
$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文件中不保留目錄結構?

預計$_post時間: $_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件事需要改變。

  1. 驗證實際的php文件是否為UTF-8。
  2. setlocale()需要在末尾包含.UTF-8。
  3. ZipArchive無法正確處理UTF-8。 必須使用CP。 希伯來語是CP862。 因此,對addFile使用額外的選項$localname及其基本上的iconv("UTF-8","CODE_PAGE_REF",$localname)

它還適用於: iconv("UTF-8", "CP852", $nameFile);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM