回答編集履歴

1

追記

2015/10/15 20:47

投稿

退会済みユーザー
test CHANGED
@@ -19,3 +19,125 @@
19
19
 
20
20
 
21
21
  内部文字エンコーディング = 実行しているPHPのエンコーディング(=UTF-8)
22
+
23
+
24
+
25
+ ---
26
+
27
+
28
+
29
+ 追記)2015/10/16
30
+
31
+
32
+
33
+ 自前のフレームワークでも出番があるかもしれないので、作ってみました。
34
+
35
+ ただし、手元の開発環境にWindowsがないため、正しい動きになるかどうかはわかりません。
36
+
37
+ 一応、エラーはなく動くことは確認していますが…。
38
+
39
+
40
+
41
+ ```php
42
+
43
+ <?php
44
+
45
+
46
+
47
+ /**
48
+
49
+ * Archive.class.php
50
+
51
+ */
52
+
53
+ class Archive
54
+
55
+ {
56
+
57
+
58
+
59
+ /**
60
+
61
+ * Windows で作成された SJIS-WIN のファイル名を含む ZIP ファイルを UTF8 に変換する
62
+
63
+ * @param string $archive
64
+
65
+ * @param string $to 変換後エンコード
66
+
67
+ * @param string $from 変換前エンコード
68
+
69
+ * @return array 置換結果を配列で返す
70
+
71
+ */
72
+
73
+ public static function convertZipEncode($archive, $to = 'UTF-8', $from = 'CP932')
74
+
75
+ {
76
+
77
+ $zip = new \ZipArchive;
78
+
79
+ $res = array();
80
+
81
+ if ($zip->open($archive) === TRUE) {
82
+
83
+ $idx = 0;
84
+
85
+ while ($zip->statIndex($idx)) {
86
+
87
+ $zipEntry = $zip->statIndex($idx);
88
+
89
+ $entryName = $zipEntry['name'];
90
+
91
+ $destName = mb_convert_encoding($zipEntry['name'], $to, $from);
92
+
93
+ $zip->renameName($entryName, $destName);
94
+
95
+ $zip->extractTo('.', $destName);
96
+
97
+ $zip->renameName($destName, $entryName);
98
+
99
+ $res[] = array('from' => $entryName, 'to' => $destName);
100
+
101
+ $idx++;
102
+
103
+ }
104
+
105
+ $zip->close();
106
+
107
+ return $res;
108
+
109
+ }
110
+
111
+ return false;
112
+
113
+ }
114
+
115
+
116
+
117
+ }
118
+
119
+
120
+
121
+
122
+
123
+ ```
124
+
125
+
126
+
127
+ ```php
128
+
129
+ <?php
130
+
131
+
132
+
133
+ require_once './Archive.class.php';
134
+
135
+
136
+
137
+ $archive = 'ファイルのパス';
138
+
139
+ $res = Archive::convertZipEncode($archive);
140
+
141
+ var_dump($res);
142
+
143
+ ```