Я создаю и загружаю zip файл с помощью /usr/bin/zip
в PHP. Проблема в том, что zip файл содержит файлы csv с именами файлов, отличных от ASCII. Я получил загруженный файл с нулевым байтом, и файл недействителен.
chdir($tmp_dir); // this is the directory where the files are written into
// CSV files that will be included in the zip file.
// assuming that the file already exist in $tmp_dir
$files = array();
$filename = "ショップ" . date("Ymd") . ".csv";
$fpath = $tmp_dir. DS . mb_convert_encoding($filename, "SJIS", "UTF-8");
$files[] = $fpath;
// The zip file to be created
$zip_file = "archive_" . date("Ymd").".zip";
$cmd = "/usr/bin/zip $zip_path *.csv";
exec($cmd);
// Force download
$fpath = $zip_file;
header("Content-Type: application/zip");
header('Content-Disposition: attachment; filename="' . $zip_path . '"');
header('Accept-Ranges: bytes');
if ($this->isIE()) {
header("Cache-Control:private");
header("Pragma:private");
}
header('Content-Length: ' . filesize($fpath));
readfile($fpath);
Я попробовал ZipArchive, но такая же проблема возникает.
chdir($tmp_dir); // this is the directory where the files are written into
// CSV files that will be included in the zip file.
// assuming that the file already exist in $tmp_dir
$files = array();
$filename = "ショップ" . date("Ymd") . ".csv";
$fpath = $tmp_dir. DS . mb_convert_encoding($filename, "SJIS", "UTF-8");
$files[] = $fpath;
// The zip file to be created
$zip_file = "archive_" . date("Ymd").".zip";
$zip = new ZipArchive();
$zip->open($zip_path, ZipArchive::CREATE);
foreach ($files as $v) {
$zip->addFile(basename($v));
}
$zip->close();
// Force download
$fpath = $zip_file;
header("Content-Type: application/zip");
header('Content-Disposition: attachment; filename="' . $zip_path . '"');
header('Accept-Ranges: bytes');
if ($this->isIE()) {
header("Cache-Control:private");
header("Pragma:private");
}
header('Content-Length: ' . filesize($fpath));
readfile($fpath);
Есть ли обходной путь для этого? Когда я удалял японские символы из имени файла, это нормально.
Я решил эту проблему, используя функцию iconv, чтобы преобразовать имена файлов в соответствующую кодировку.
$filename = iconv('SJIS', 'CP392//TRANSLIT', "ショップ" . date("Ymd") . ".csv");
$fpath = $tmp_dir. DS . $filename;
Это означает, что он преобразует входную кодировку SJIS в выходной набор CP392 для имени файла. CP392 - это кодовая страница для Shift JIS.
Кодовая страница 932 (сокращенно CP932, также известная под именем IANA Windows-31J) является расширением Microsoft Shift JIS для включения специальных символов NEC (строка 13), выбор NEC расширений IBM (строки от 89 до 92) и расширения IBM ( Строки от 115 до 119). Кодированные наборы символов - JIS X0201:1997, JIS X0208: 1997 и эти расширения. Windows-31J часто ошибочно принимается за Shift JIS: в то время как аналогично, различие имеет большое значение для программистов, желающих избежать моджибака, и повод для использования однозначного UTF-8. Имя Windows-31J, однако, является IANA и не признано Microsoft, которое исторически использовало shift_jis.