質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

1回答

4955閲覧

PHPのZipArchiveクラスでオープンしたzipファイル内のファイル名が文字化けする現象を直したい。

gegegege

総合スコア26

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2021/05/26 00:15

編集2021/05/27 05:47

前提・実現したいこと

PHPのZipArchiveクラスのextractToメソッドで展開したファイルの名前が日本語の時に文字化けする問題がありました。
オープンしたzipファイル内のファイル名がエンコードできれば問題が解決できそうなので、エンコードする方法を教えていただきたいです。

発生している問題・エラーメッセージ

PHP ZipArchive extractToで解凍した日本語ファイルが文字化けを参考にファイル名のエンコードができないかいろいろ試してみましたが、自分の環境ではできません。
「該当のソースコード」を動かすと下記が出力されます。

エンコード無しのファイル名:âeâXâg.pdf 文字コードチェックした結果:SJIS SJIS からUTF-8 にエンコードした結果:テ「eテ「Xテ「g.pdf SJIS-win からUTF-8 にエンコードした結果:テ「eテ「Xテ「g.pdf CP932 からUTF-8 にエンコードした結果:テ「eテ「Xテ「g.pdf UTF-8 からSJIS にエンコードした結果:?e?X?g.pdf UTF-8 からSJIS-win にエンコードした結果:?e?X?g.pdf UTF-8 からCP932 にエンコードした結果:?e?X?g.pdf

該当のソースコード

index.phpと同じディレクトリにある「テスト.zip」を読み込みます。
「テスト.zip」の中には「テスト.pdf」がいます。

PHP

1<?php 2 $zip = new ZipArchive; 3 if ($zip->open("./テスト.zip") === true) { 4 $idx = 0; 5 $zipEntry = $zip->statIndex($idx); 6 $entryName = $zipEntry['name']; 7 8 echo "エンコード無しのファイル名:" . $entryName . "<br>"; 9 10 $encode = mb_detect_encoding($entryName, "Shift-JIS,EUC-JP"); 11 echo "文字コードチェックした結果:" . $encode . "<br>"; 12 13 $to = "UTF-8"; 14 $from = "SJIS"; 15 $destName = mb_convert_encoding($entryName, $to, $from); 16 echo "$from から$to にエンコードした結果:" . $destName . "<br>"; 17 18 $to = "UTF-8"; 19 $from = "SJIS-win"; 20 $destName = mb_convert_encoding($entryName, $to, $from); 21 echo "$from から$to にエンコードした結果:" . $destName . "<br>"; 22 23 $to = "UTF-8"; 24 $from = "CP932"; 25 $destName = mb_convert_encoding($entryName, $to, $from); 26 echo "$from から$to にエンコードした結果:" . $destName . "<br>"; 27 28 $to = "SJIS"; 29 $from = "UTF-8"; 30 $destName = mb_convert_encoding($entryName, $to, $from); 31 echo "$from から$to にエンコードした結果:" . $destName . "<br>"; 32 33 $to = "SJIS-win"; 34 $from = "UTF-8"; 35 $destName = mb_convert_encoding($entryName, $to, $from); 36 echo "$from から$to にエンコードした結果:" . $destName . "<br>"; 37 38 $to = "CP932"; 39 $from = "UTF-8"; 40 $destName = mb_convert_encoding($entryName, $to, $from); 41 echo "$from から$to にエンコードした結果:" . $destName . "<br>"; 42 43 $zip->close(); 44 } 45?>

補足情報(FW/ツールのバージョンなど)

環境
OS:Windows10
zipファイル:Windows10で圧縮
PHPバージョン:8.0.1

追記

圧縮のコード
index.phpと同じディレクトリの「テスト.pdf」ファイルを「テスト2.zip」というファイル名で同じディレクトリに圧縮

if ($zip->open("./テスト2.zip", ZipArchive::CREATE|ZipArchive::OVERWRITE) === true) { $zip->addFile('./テスト.pdf'); $zip->close(); }

結果は「テスト2.zip」というファイルができますが、ダブルクリックしても「このフォルダーは空です。」となります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/05/26 00:48

ちなみにそのzipを既存の解凍ソフトで解凍した場合はどうでしょうか
m.ts10806

2021/05/26 00:49

もとが化けてるなら化けに化けを重ねてるだけになります
gegegege

2021/05/26 00:50

Windows標準の展開、7-Zipともに問題なく展開されます。
tacsheaven

2021/05/26 00:55

このコードだとShift-JIS でも EUC-JP でもないなら、文字化けの判定すらできませんねえ……
m.ts10806

2021/05/26 01:19

もう一つ試してもらいたいのはZipArchiveによる圧縮。
gegegege

2021/05/26 02:26

ZipArchiveで圧縮するときに文字化けしないかどうかを確認するということでしょうか。
gegegege

2021/05/26 12:56

ちなみに圧縮も上手くできていない様子です。 詳細は追記のところに書きました。 圧縮も上手くできないことが文字化けにもつながるのでしょうか。
guest

回答1

0

自己解決

こちらのサイトで自己解決しました。

どうやらZipArchiveが勝手に文字コードを判定して間違った変換を掛けてしまうようで、CP932の生値が取れないのが原因のようです。
CP932の生値が欲しい時はstatIndexにZipArchive::FL_ENC_RAWを付けてやると文字コード判定を無効にできてその後の変換(mb_convert_encoding)が上手くいきます。

投稿2021/06/27 06:20

gegegege

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問