Создание zip-файла, содержащего файлы с кодовым именем UTF-8 в PHP, с использованием / usr / bin / zip

0

Я создаю и загружаю 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);

Есть ли обходной путь для этого? Когда я удалял японские символы из имени файла, это нормально.

Теги:
zip
utf-8
non-ascii-characters

1 ответ

0
Лучший ответ

Я решил эту проблему, используя функцию 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню