zipファイル展開時の日本語ファイル名文字化け(php7)

投稿日時: 2019/02/11 t-ima

お世話になります。

キャビネットにアップロードした,日本語ファイル名のファイルを含む.zipファイルを
展開(解凍)しようとして日本語ファイル名が化けるという現象が発生しました。
Windows10で作成した.zipファイルなので,もちろん文字コードの問題です。
ソースファイルを眺めると対策されているようなのですが,
当方で使用しているphpが7.2.10で,最近のphpのZipArchiveでは以下のようなことがあるそうです。

https://blog.narazaki.info/index.php/2017/06/11/php7%E3%81%A7ziparchive%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%8C%E5%8C%96%E3%81%91%E3%82%8B%E5%95%8F%E9%A1%8C/

とりあえずquick hackで現象を回避するパッチを作成しました。php7以外のことは考えていません。

(ちなみに,これと同時にOSのlocaleをja_JP.UTF-8にしないと日本語ファイルの展開に失敗するという
現象がありました。ZipArchive::extractToで失敗していたのでNetCommons側の問題ではありません。
使用OSはubuntu 18.04 LTS,httpサーバはapache 2.4.29)

php5との互換性などの検証・対応等をご検討いただけますようよろしくお願いいたします。

*** NetCommons3/app/Plugin/Files/Utility/UnZip.php.orig	2018-11-08 23:23:12.000000000 +0900
--- NetCommons3/app/Plugin/Files/Utility/UnZip.php	2019-02-11 18:27:43.892883164 +0900
***************
*** 128,141 ****
  		$index = 0;
  		while ($zipEntry = $zip->statIndex($index)) {
  			$zipEntryName = $zipEntry['name'];
! 			$destName = mb_convert_encoding($zipEntry['name'], $encodeCharset, 'auto');
  			if ($zip->renameName($zipEntryName, $destName) === false) {
  				return false;
  			}
  			if ($zip->extractTo($path, $destName) === false) {
  				return false;
  			}
! 			if ($zip->renameName($destName, $zipEntryName) === false) {
  				return false;
  			}
  			$index++;
--- 128,143 ----
  		$index = 0;
  		while ($zipEntry = $zip->statIndex($index)) {
  			$zipEntryName = $zipEntry['name'];
! 			$zipEntry2 = $zip->statIndex($index, ZipArchive::FL_ENC_RAW);
! 			$zipEntry2Name = $zipEntry2['name'];
! 			$destName = mb_convert_encoding($zipEntry2Name, $encodeCharset, 'auto');
  			if ($zip->renameName($zipEntryName, $destName) === false) {
  				return false;
  			}
  			if ($zip->extractTo($path, $destName) === false) {
  				return false;
  			}
! 			if ($zip->renameName($destName, $zipEntry2Name) === false) {
  				return false;
  			}
  			$index++;