teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2015/10/15 20:47

投稿

退会済みユーザー
answer CHANGED
@@ -8,4 +8,65 @@
8
8
 
9
9
  > 変換前の文字エンコーディング名を指定します。 これは、配列またはカンマ区切りの文字列とすることが可能です。 from_encoding を指定しなかった場合は、内部文字エンコーディングを使用します。
10
10
 
11
- 内部文字エンコーディング = 実行しているPHPのエンコーディング(=UTF-8)
11
+ 内部文字エンコーディング = 実行しているPHPのエンコーディング(=UTF-8)
12
+
13
+ ---
14
+
15
+ 追記)2015/10/16
16
+
17
+ 自前のフレームワークでも出番があるかもしれないので、作ってみました。
18
+ ただし、手元の開発環境にWindowsがないため、正しい動きになるかどうかはわかりません。
19
+ 一応、エラーはなく動くことは確認していますが…。
20
+
21
+ ```php
22
+ <?php
23
+
24
+ /**
25
+ * Archive.class.php
26
+ */
27
+ class Archive
28
+ {
29
+
30
+ /**
31
+ * Windows で作成された SJIS-WIN のファイル名を含む ZIP ファイルを UTF8 に変換する
32
+ * @param string $archive
33
+ * @param string $to 変換後エンコード
34
+ * @param string $from 変換前エンコード
35
+ * @return array 置換結果を配列で返す
36
+ */
37
+ public static function convertZipEncode($archive, $to = 'UTF-8', $from = 'CP932')
38
+ {
39
+ $zip = new \ZipArchive;
40
+ $res = array();
41
+ if ($zip->open($archive) === TRUE) {
42
+ $idx = 0;
43
+ while ($zip->statIndex($idx)) {
44
+ $zipEntry = $zip->statIndex($idx);
45
+ $entryName = $zipEntry['name'];
46
+ $destName = mb_convert_encoding($zipEntry['name'], $to, $from);
47
+ $zip->renameName($entryName, $destName);
48
+ $zip->extractTo('.', $destName);
49
+ $zip->renameName($destName, $entryName);
50
+ $res[] = array('from' => $entryName, 'to' => $destName);
51
+ $idx++;
52
+ }
53
+ $zip->close();
54
+ return $res;
55
+ }
56
+ return false;
57
+ }
58
+
59
+ }
60
+
61
+
62
+ ```
63
+
64
+ ```php
65
+ <?php
66
+
67
+ require_once './Archive.class.php';
68
+
69
+ $archive = 'ファイルのパス';
70
+ $res = Archive::convertZipEncode($archive);
71
+ var_dump($res);
72
+ ```