• 締切済み

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));

  • PHP
  • 回答数1
  • ありがとう数0

みんなの回答

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

  • 文字列のエンコードについて

    例えば以下のコードで日本人がターゲットのサイトを作ったときにエンコードがutf8以外ってありますか?idなどもutf8でなんとかなるのになぜ他の文字コードは必要なのですか? //SJISに変換 $str = "私のidはrxxdtggb63332224667です。"; $result = mb_convert_encoding($str, "SJIS"); echo $result . "\n"; //UTF-8に変換 echo mb_convert_encoding($str, "UTF-8"); //SJISに変換 $str = "gcdddyyghgcc.jpg"; $result = mb_convert_encoding($str, "SJIS"); echo $result . "\n"; //UTF-8に変換 echo mb_convert_encoding($str, "UTF-8");

    • ベストアンサー
    • PHP
  • PHP+Postgres 「髙」が文字化け

    DB上に格納した文字列を取得し、PHPで出力すると、 「髙」(はしごだか)等、一部の文字が「□・」のような見た目に化けてしまいます。 環境は以下です。 Linux(CentOS 5) PHP 5.1.6 Apache 2.2.3 PostgreSQL 8.4.3 文字コードは以下です。 Postgres:EUC-JP PHPソース:EUC php.ini の[mbstring]はコメントのまま変更していません。 文字コードの変換を試してみたのですが、「髙」としては出力できませんでした。 Windows上では「CP51932」に変換すると正常に出力できましたが、Linux上ではやはり駄目でした。 mb_language("uni"); mb_internal_encoding("euc-jp"); mb_http_input("auto"); mb_http_output("euc-jp"); $str = "髙橋"; print(mb_convert_encoding($str, "EUCJP-win")); print(mb_convert_encoding($str, "EUCJP-win","EUC-JP")); print(mb_convert_encoding($str, "SJIS")); print(mb_convert_encoding($str, "SJIS","EUC-JP")); print(mb_convert_encoding($str, "SJIS-win")); print(mb_convert_encoding($str, "SJIS-win","EUC-JP")); print(mb_convert_encoding($str, "UTF-8")); print(mb_convert_encoding($str, "UTF-8","EUC-JP")); print(mb_convert_encoding($str, "EUC","SJIS")); print(mb_convert_encoding($str, "Unicode")); print(mb_convert_encoding($str, "Unicode","EUC-JP")); print(mb_convert_encoding($str, "UTF-8", "sjis-win")); print(mb_convert_encoding($str, "CP51932")); print(mb_convert_encoding($str, "MS932")); print(mb_convert_encoding($str, "MS932","EUC-JP")); print(mb_convert_encoding($str, "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win" ), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win","EUC-JP"), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "EUCJP-win","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "EUCJP-win","SJIS-win")); http://blog.livedoor.jp/loopus/archives/50160285.html 上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、 文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。 ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。

    • ベストアンサー
    • PHP
  • urlencodeしていない日本語をPATH_INFOで

    お世話になっております。 Wikipedia等のようにアクセスする際にURLに直接書いた日本語を PATH_INFOで受け取って処理をしたいのですが、うまくいきません。 試しに、 echo $_SERVER['PATH_INFO']; echo mb_convert_encoding($_SERVER['PATH_INFO'],"utf-8","sjis"); echo urldecode(mb_convert_encoding(urlencode($_SERVER['PATH_INFO']),"utf-8","sjis")); とした、BOM付UTF-8のPHPファイルに、 http://~/test.php/日本語 で[日本語]を色々変えてアクセスすると、 一行目と三行目は同じ結果になり、二行目だけ異なった結果となります。 一・三行目が上手く表示された時は二行目が文字化けしており、 一・三行目が文字化けした時は二行目が正常に表示されています。 (全てが文字化けすることもあります) どのようにすれば文字化けが起こらず、うまく受け取れるのかが分かりません。 本当はUTF-8ではなく、EUC-JPで行いたいのですが EUCはほとんどの場合、文字化けしてしまいます。 どのようにすれば良いのでしょうか。ご教授を宜しくお願い致します。 なお、php.iniは変更できません。

    • ベストアンサー
    • PHP
  • 名前が日本語のファイルダウンロード方法

    IEでページを表示して、そこのリンクをクリックするとダウンロードの画面が開きダウンロードするという方法で http://test.com/日本語.xls をクリックしたとき、ファイルはあるにもかかわらず、ファイルがないというエラーが出ます。 php側の文字コードは「utf8」です。 mb_convert_encoding($filename, "SJIS", "utf8") としてもダメでした。 この方法でダメな場合、他に方法はありますか?

    • ベストアンサー
    • PHP
  • MySQLでの文字化けについて

    すいません、教えてください。 PHP(PHP-5.2.4)でCSVファイル を読み込んでMySQL(4.1.22)に INSERTしているのですが文字化けします。 SJIS→utf8_general_ciです。 いろいろ調べて ~ $wk[$i] =mb_convert_encoding($csvfile[$i],'UTF-8','SJIS-win'); ~ とかやってみたのですがうまくいきません。 どなたかよろしくお願いします。

    • 締切済み
    • PHP
  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • 文字エンコードについて

    Blogの更新をPHPで挑戦してみたのですが、文字化けしちゃって訳がわかりません… PHPのバージョンは5.1.6.6でバッチファイルを使用してます。 色々調べてみた結果Blogの方の文字コードがShift_JISみたいなので (PHPは基本UTF-8ですよね?) mb_convert_encodingかmb_convert_variablesの関数かなと思って使用してみたのですが結果はエラーがおきてしまい↓↓どうしていいのか分かりません、、 mb_convert_encoding(変換したい文字列, "SJIS", "auto"); mb_convert_variables("JIS", "UTF-8", 変換したい文字列); autoのところをUTF-8にしてもおなじでした… もちろん一つずつ試しました。 どなたかいい解決方法を教えて頂けませんか?

    • 締切済み
    • PHP
  • phpのmb_convert_encodingで文字化け

    phpのmb_convert_encodingで文字化け phpでmb_convert_encodingを使用してSJISよりUTF-8にエンコーディングしています。 ところが、“(”や“?”などが1文字目に存在すると文字化けしてしまいます。 どのような原因が考えられますでしょうか? お願いいたします。

    • ベストアンサー
    • PHP
  • php4、php5によるimplode()、file()の動作の違い?

    お世話になります。 SJISのファイルで、 //----コメント //あああ //--------------- あああ,いいいいいいいいいいいいい ううううう,えええええええええええええ のようなファイルを作成して $csv へこSJISファイルのファイルパスを設定し、 $FielList = mb_convert_encoding(@implode('', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("\r\n",$FielList); foreach($RowData as $Value) { $FName=trim($FName);$Cmnt=trim($Cmnt); echo '$FName='.$FName.'<br> $Cmnt='.$Cmnt.'<br>'; } と、その内容を見ると php5では、 $FName=//あああ $FName=//--------------- $FName=あああ $Cmnt=いいいいいいいいいいいいい $FName=ううううう $Cmnt=えええええええええええええ と、想定の結果が得られます。 しかし、php4だと、 $FName=//あああ//--------------- となってしまい、どうもcsvファイルの内容が\r\nにより仕切られて配列とならないようです。 そこで、 $FielList = mb_convert_encoding(@implode('###', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("###",$FielList); とすれば、php4,php5でも動作します。 また、 $FielList = mb_convert_encoding(@implode('', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("\n",$FielList); とすると、php4で予想の結果が返されますが、 php5では、echo で何も表示されなくなります。 ません。 php4、php5による \r\nの扱いの違い implode()の動作の違い file()の動作の違い だと思うのですが、どのように違うのかがわかりません。 このあたりのことをおわかりの方、 implode('###',@file(・・・ ) と記述しなくても implode('',@file(・・・ ) と記述することによりphp4、php5で同じように動作する方法がわからないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpとMysqlの文字化け

    何度もすみません。 phpからinsertするときとphpmyadminから直接挿入するときどちらも文字化けを起こします。 phpは4.4.9でmysqlは5です。 myadminのMySQL 接続の照合順序はsjisにしております。 照合順序と保存される文字コードは違うのでしょうか。 phpファイルはsjisで保存しています。 過去の質問を見たり、調べてset name sjisとset name ujisと mb_convert_encoding($str, "EUC-JP", "SJIS");を それぞれ試しましたが文字化けのままです。 mb_convert_encoding($str, "utf-8", "SJIS"); であいうえおと入力してみたところあい???となりました。 また、adminから直接挿入した時、同じくあいうえおと入力しましたが、 こちらもあい???となりました。 adminの設定はutf-8ということのでしょうか。 照会順序以外文字コードについて表示されているところがわからなかったのですが、 どこで確認できますでしょうか。 また、php、adminともどこの設定を確認すれば良いのでしょうか? 恐れ入りますが教えていただけますでしょうか。

    • ベストアンサー
    • PHP

専門家に質問してみよう