• 締切済み

php5.4でwin 日本語ファイル一覧表示

こんにちは。 質問の仕方もうまくできずすみません。 現在、PHPを勉強しており、以下作業を行っているのですが うまくいかず、お知恵をお借りしたく質問させていただきました。 作業としてはwindows7ローカルにある「日本語フォルダ」「日本語ファイル」の 一覧をXAMPP PHP5.4を使って表示させたいのですがフォルダ名に「ソーダ」が含まれていると フォルダと下位ファイルが表示されません。 他質問等を見て文字コードの変換が必要とのことなのですが どのようにすればよいかわからないです。 再帰的にすべてのフォルダのファイルを表示するには どのようにすればよいでしょうか? よろしくお願いいたします。 <?php setlocale(LC_ALL, 'ja_JP.SJIS'); mb_convert_variables("SJIS-win","UTF-8", $it); mb_convert_encoding($it, 'UTF-8', 'CP932'); //内部処理用に文字コードをUTF-8とする $it = mb_convert_encoding($path,$it,"UTF-8","SJIS-win" ); //(.)(..)ファイルをスキップ $it = new RecursiveDirectoryIterator('./', FilesystemIterator::SKIP_DOTS); //パスとファイル名を取得 $it = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); foreach ($it as $item) { $path = $item->getPathname(); if ($item->isDir()) { $path .= '/'; } //文字コード変換 $result[] = mb_convert_encoding($path, "UTF-8","SJIS-win"); } echo nl2br(print_r($result, true));

みんなの回答

noname#244856
noname#244856
回答No.1

Windows7 PHP5.5 環境で検証してみました。私の環境では何の問題もなく「ソーダ」という文字列がファイル名に含まれていても表示できました。多分「ソ」が含まれているので5C問題のことだと思うんですが、現象を再現出来ていないので回答に不備があるかもしれません。 まずですね、検証前にわけもわからずコピペした不適当なコードを見直すところから始めるべきです。これだとエラーがたくさん発生しているはずです。エラーが非表示の状態でデバッグを行うことなど苦難の道に他ならないので、エラーをちゃんと表示させましょう。 【エラーに関して】 http://qiita.com/mpyw/items/2f9955db1c02eeef43ea#php%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E7%A8%AE%E9%A1%9E 最初のロケールを設定する setlocale はまだしも、それに続く3行が酷いですね…未定義の変数 $it に対して操作を行っているようですが、これらはエラーが発生するだけで完全に無意味です。それだけでなく、最初のロケール設定も SplFileObject 系に関しては意味を為しません。また、私の環境では「ja_JP.SJIS」というロケールは存在しませんでした。「japanese.sjis」ならありましたが… 【Windows環境のPHPで日本語ファイルパスを扱う場合の注意点】 http://k-holy.hatenablog.com/entry/2014/09/03/085847 ですので、どうしても「Windowsで日本語ファイル名を扱いたい」という要望がある場合、SPL系のクラスを使わずに従来の関数だけで実現するべきです。動作速度は劣りますが仕方ないです。array_mergeを連呼するのはどうしても避けたかったので、static変数を使って再帰レベルでうまいこと場合分けしてみることにしました。 <?php header('Content-Type: text/plain; charset=Shift_JIS'); setlocale(LC_ALL, 'japanese.sjis'); $scan = function ($dir) use (&$scan) { static $s_list = []; $is_root = !$s_list; foreach (array_diff(scandir($dir), ['.', '..']) as $file) { $path = "$dir/$file"; if (is_dir($path)) { $s_list[] = "$path/"; $scan($path); } else { $s_list[] = $path; } } if ($is_root) { $r_list = $s_list; $s_list = []; return $r_list; } }; print_r($scan('.'));

関連するQ&A