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

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

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

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

1回答

4369閲覧

WEBサーバー上でのzipファイルの解凍

Praline

総合スコア46

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2016/07/10 15:31

■事象
windowsで作成したzipファイルをサーバー上で解凍すると文字化けする。

■実現したいこと
phpで文字化けさせずファイルを解凍する。

phpでzipファイルのアップロード及びサーバー上で解凍する処理を作成したいと考えております。
他サイトの情報を参考に、ZipArchive::extractToを使用した処理を書いているのですが、windowsで圧縮したzipファイルだと、全て文字化けします。
phpは全てUTF-8のファイルにて作成しております。

下記ページを参考にしながらファイル名を変換し出力しようとしているのですが、うまく行きません。
https://teratail.com/questions/17847

■確認したこと
・ZipArchiveで習得したファイル名がUTF-8と判定される(winだとCP932であるべき?)
・取得したファイル名及びそれを他の文字コードに変換したファイル名を出力しても文字化けします。
・ファイルマネージャ等から解凍しても、全て文字化けする。
・圧縮前のファイルをそのままアップロードしても、文字化けせずアップロードが可能。
・locale情報が'C'と返される。

連々と書きましたが、本事象の解決点や確認すべき点などありましたら、ご指摘いただけると幸いです。

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

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

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

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

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

guest

回答1

0

Kosuke_Shibuyaさんが作ってくれたclassを使ってもダメってことですか?
そこでは、文字コードを指定する(指定しないとCP932になる)ようになっていますが、
それでもダメなんでしょうか。

・ZipArchiveで習得したファイル名がUTF-8と判定される(winだとCP932であるべき?)

まあ、このあたりがおかしいですよね。「UTF-8と判別される」としても内容はCP932なんですよね?
なら、mb_convert_encodingで変換できるはずです。

そうじゃなかったら、ZipArchiveがファイル名を破壊していることになります。

追記

ZipArchiveで日本語ファイル名を扱えない場合があって困った話
って記事もありました。ZipArchiveは曲者ですね。

投稿2016/07/11 12:12

編集2016/07/11 12:29
shi_ue

総合スコア4437

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

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

Praline

2016/07/11 13:47 編集

$zipEntry = $zip->statIndex($idx); $entryName = $zipEntry['name']; ここで取得した$entryNameをmb_detect_encoding関数で判定した結果がUTF-8になるんですよね… ちなみにそのままechoしたら文字化けします。
退会済みユーザー

退会済みユーザー

2016/07/11 13:51

横レスすみません。 mb_detect_encoding 第3引数まで指定してます?
shi_ue

2016/07/11 13:58

echo mb_convert_encoding($entryName, 'UTF-8', 'CP932'); ってやっても化けるんですか?
Praline

2016/07/11 14:34

>Kosuke_Shibuyaさん 第3引数をtrueにして判定したのですが、UTF-8、CP932いずれもtrueが返ってくるのは何故でしょう… 少なくともUTF-8だと全てtrue、CP932にするとtrue,falseがごちゃごちゃになって返ってきます。 >shi_ueさん 見事に文字化けしますね…。
退会済みユーザー

退会済みユーザー

2016/07/11 16:08 編集

なぜでしょうと言われても、こちらで現象を再現できない限り明言はできませんよ。 > いずれもtrueが返ってくる true はありえませんね。 > 検出した文字エンコーディングを返します。 指定した文字列からエンコーディングを検出できなかった場合は FALSE を返します。 trueが返るというのは確認の仕方がおかしいとしか言えません。
mpyw

2016/07/11 16:12 編集

(コメント削除)
Praline

2016/07/12 13:37

>trueが返るというのは確認の仕方がおかしい 失礼致しました。false以外は対応した文字コードが返っております。 ただ疑問なのが、ファイル名に全角文字を含むファイルを作成し、それらをwindows上で圧縮すると全てUTF-8で返ってくるという点です。 ちなみに、$res = mb_detect_encoding($entryName, 'cp932', true);として判定しております。
退会済みユーザー

退会済みユーザー

2016/07/12 13:43 編集

第2引数の指定の仕方が間違っていますね。 詳しくはリファレンスを。 $res = mb_detect_encoding($entryName, 'cp932,sjis-win,utf-8', true);
Praline

2016/07/12 15:26

ご指摘ありがとうございます。そもそも最初に使っていたファイルが、UTF-8とcp932が混じっていたようです… 改めてwinで作成したzipだと全てcp932判定されました。 解凍については、文字コードの変換がうまく出来ず、文字化けしたまま出力されるため、少し試行錯誤してみます。
退会済みユーザー

退会済みユーザー

2016/07/12 15:30

こちらの環境にWINがないので、ご本人にやってもらうしかなくて、申し訳有りません。 前回の回答でも、質問者にフィードバックをお願いしていたんですけどね… 目の前の問題が片付いちゃうとどうでもよくなっちゃうんでしょうね…
Praline

2016/07/13 13:33

できるだけ自分も残せるようにしたいとは思います… ちなみに、習得した文字列の判定なのですが、 「あいうえお.txt」→CP932「éáéóéñéªé¿.txt」 「かきくけこ.txt」→UTF-8「é⌐é½é¡é»é▒.txt」 と判定及び出力されるので、そもそも自分の環境が怪しい気がしてきました…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問