• 締切済み

dirnameでパスが正しく取れない PHP

お世話になります。 dirnameで正しくパスが取得できません。 勝手に途中で途切れてしまいます。 なぜでしょうか。 下記がサンプルです。 echo(dirname("C:\Users\fukuda\Documents\社内書類\ISO関連\土木用\ISO様式関係 2012.7.1(最新版)\ISO様式(最新版) 2012-07-01\4.2文書化")); 結果… C:\Users ukuda\Documents\社内書類\ISO関連\土木用\ISO様式関係 2012.7.1(最新版) 二つ分ディレクトリが抜け落ちています。 この原因と対策を教えてください。 よろしくお願いいたします。

みんなの回答

noname#259146
noname#259146
回答No.5

setlocale(LC_ALL, "nld_nld"); としても正しく結果が得られます。 phpのmb 関連の設定で標準から変更したところはありませんか? PHPのヴァージョンは最新でしょうか? 2013/12 現在のPHP最新バージョンはPHP 5.5.7となっています 私のPHP 5.4.7 (cli) (built: Sep 12 2012 23:48:31)では前回の回答のように問題ありません。

tatapatank
質問者

お礼

返答が遅れ、申し訳ありませんでした。 ご指摘いただいた一行、setlocale(LC_ALL, "nld_nld");を 入れたところ、正常に表示されるようになりました。 ちなみに、入れる前は、これも指摘していただいたとおり、 LC_COLLATE=C;LC_CTYPE=Japanese_Japan.932;となっていました。 PHPは5.3.5でした。 xampp1.8.0でまとめて入れたので、特に環境はいじっていないと 思います。それとも、xamppの設定で何か変更されてしまうのでしょうか。 教えていただき、本当にありがとうございました。 また何かありましたら、よろしくお願いいたします。

tatapatank
質問者

補足

重ねて申し訳ありません。 一度は解決したと思ったのですが、勘違いをしていたらしく、 再度確認したところ、問題点は修正されませんでした(パスがおかしいまま)。 setlocaleなども設定してみましたが、特に変化はありませんでした。 $stPathに、例のフォルダパスが入っているものとして…、 // 指定のフォルダのフォルダとファイルの一覧を取得 $dir = new DirectoryIterator($this->stPath); ↑$dirには正常にフォルダとファイルのパスが入っています。 print(dirname($stPath)); ↑これだとおかしくなる。 といった感じです。 全てで失敗しているのではなく、正しく表示されているものもあったため、 解決したものだと思い込んでいました。 困惑させてしまうようなことをしてしまい、大変申し訳ありませんでした。

noname#259146
noname#259146
回答No.4

echo setlocale(LC_ALL, 0); で内容を確認してみてください。 LC_COLLATE=C;LC_CTYPE=Japanese_Japan.932; でしょうか?

noname#259146
noname#259146
回答No.3

引数がダブルクォーテーションかシングルクォーテーションの違いです 「\42」の扱いで問題が発生したいます。 対策はdirnameの引数を渡す時にダブルクォーテーションでは無くシングルクォーテーションでくくってください。 echo(dirname('C:\Users\fukuda\Documents\社内書類\ISO関連\土木用\ISO様式関係 2012.7.1(最新版)\ISO様式(最新版) 2012-07-01\4.2文書化')); は希望通りの結果が出ます。 以下余談 PHPでは、文字列の括りにダブルクォーテーションとシングルクォーテーションが使用できます。 この2つは意味合いが異なりますので注意が必要です。 どんな違いかといいますと、 ・ダブルクォーテーション  ・・・ 文字列中の変数を変数値に置換する ・シングルクォーテーション ・・・ 文字列中の変数を変数値に置換しない ダブルクォーテーションの方が高機能な処理を行っているため、シングルクォーテーションの方が処理が速いです。 変数の置換を行う必要が無い場合はシングルクォーテーションを使うようにした方がよさそうです。

tatapatank
質問者

補足

回答、ありがとうございます。 試してみたのですが、特に変化はありませんでした。 私の記述不足もありましたが、dirmaneに渡される引数は、 リテラルではなく、scandirで取得したディレクトリ名を 引数に渡しています。 そのため、取得した文字列が"か'かの区別はないと思います。 説明不足で申し訳ありません。 引き続き、ご助力をお願いいたします。

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.2

文字列リテラル中のバックスラッシュ(または\マーク)の扱いに注意してください。 http://www.php.net/manual/ja/language.types.string.php

tatapatank
質問者

補足

回答ありがとうございます。 \を/等におき返してみたりしましたが、 特に変化がありませ仮でした。 引き続き、ご助力をお願いいたします。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

setlocaleはどうなっていますか? http://www.php.net/dirname >dirname() はロケールに依存します。マルチバイト文字を含むパスで >正しい結果を得るには、それと一致するロケールをsetlocale() で設定 >しておかなければなりません。

tatapatank
質問者

補足

ご回答、ありがとうございます。 多分原因はこのsetlocaleだと思うのですが、 具体的にどのようにすればよいのでしょうか。 setlocale(LC_ALL, '');と、文頭に入れてはみましたが、 特に変化はないようです。 引き続き回答いただければ幸いです。

関連するQ&A