• 締切済み

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(最新版) 二つ分ディレクトリが抜け落ちています。 この原因と対策を教えてください。 よろしくお願いいたします。

  • PHP
  • 回答数5
  • ありがとう数2

みんなの回答

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

  • include_pathについて。

    PHP 5.2以上のバージョンの話として質問をさせて頂きます。 (ローカルではWindows版XAMPPを使用。リモートはLinuxサーバー。) ----- <ファイルの位置関係> imgディレクトリ --- C.jpg (画像ファイル) mainディレクトリ --- A.php sub ディレクトリ --- funcディレクトリ --- B.php (img、main、subディレクトリは3つとも同階層) //------- (A.phpの記述) require_once '../sub/func/B.php'; //------- (B.phpの記述) echo '<img src="C.jpgのパス">'; // ←■画像Cを表示したい■ //★どう表示されるかテスト★ echo dirname(__FILE__) ;   //----- このような状況で、 A.phpにアクセスすると、★テスト★の所は、 ~/sub/func   //←のように表示される。 // つまりこれは、__FILE__ は、 // A.phpではなく、B.phpを指している。(?) と、このような時、B.phpの中で、 C画像の相対パスは、どう書いたらよろしいのでしょうか? A.phpから見た、C画像の相対パスで書いたらいい? それとも、B.phpから見たソレでしょうか? phpinfo()でinclude_pathの項目を調べると、 .:/usr/local/lib/php/~ のように書かれています。(デフォルトのままです。)

    • ベストアンサー
    • PHP
  • Craving Explorer でダウンロードについて

    Craving Explorerの最新版が出ていたのでインストールしました。 今までのバージョンでダウンロードしたら、たとえば、 wavでダウンロードするとD:\ユーザー\私のユーザー名\ドキュメント\CravingExplorer\download\wavに勝手に入った(「ドキュメント」はC ドライブからDドライブに移動したため)のですが、 最新版でダウンロードすると、新しく勝手にフォルダがつくられてC:\Users\私のユーザー名\Documents\CravingExplorer\download\wavに入れられてしまいます。 今までどおりに D:\ユーザー\私のユーザー名\ドキュメント\CravingExplorer\download\wavに 勝手に入れるにはどうすればよいでしょうか。 Craving Explorer オプションで保存先は D:\ユーザー\私のユーザー名\ダウンロード\FLVデータとしてみましたが解決できていません。

  • 建築工事のISOに従った各工種の施工計画書様式はないでしょうか

    私は、社内でISO9000sの建築担当として、文書の見直し改定及び現場の指導をやっています。我が社では、ふくれあがった書類の多さに対して簡素化を要求されています。 特に標題の計画書の簡素化された(例:A4一枚に要点のみ記載されたもの)様式があれば教えてください

  • DAEMONソフトのインストール方法

    OSを98から2000に変更してから最新版のDAEMONをインストールを行うとインストラーが途中で止まります。アプリケーションの追加と削除の所からの削除も試みましたが同じ所で止まります。C:\Documents and Settings\All Users\デスクトップ\daemon\と出てOKを押しても進みません。どうしたらよいでしょうか?

  • 各種書類への電子印鑑の有効性

    お世話になっております ISOの関係でお聞きします。 社内で各種書類を作成、配布しておりますが、今までは三文判を押してコピーを配布してましたが、配布作業の簡略化の為最近”電子印鑑”を使うようになってきました。 こういう書類はISO的に言って有効なのでしょうか。 ISOを取得している会社で実際に使っている方や、あるいは使ったら監査で指摘を受けて止めたなどがあればご教示お願いいたします。

    • ベストアンサー
    • ISO
  • マイコンピュータの共有フォルダの関連づけが消えた

    マイコンピュータ内の共有フォルダと C:\Documents and Settings\All Users\Documentsが関連づけられていない状態になり、 C:\Documents and Settings\All Users\Documentsに存在するファイルやフォルダが マイコンピュータ内の共有フォルダから見ることができなくなっしまいました。 (フォルダ内に何もない状態で表示される) なお、C:\Documents and Settings\All Users\Documents 自体は、他のPCから shareddocsとして、ファイルを見たりコピー・移動・削除が普通にできます。 共有フォルダの機能自体は正常というわけです。 C:\Documents and Settings\All Users\Documents と辿るのが面倒なので、 マイコンピュータ内の共有フォルダアイコンの機能を元通りにしたいのですが?

  • フォルダにアクセスできません

    WinXPで、ユーザーアカウントを4つ使っていて、1人のユーザーのマイドキュメントフォルダに、他のユーザーがアクセスしようとすると、アクセス拒否になってしまいます。 エラーメッセージは「C\documents and setting\ユーザー名\My Documentsにアクセスできません。」と出ます。他のユーザーのドキュメントには正常にアクセスできます。 関係しているのかもしれないことは、3人のユーザーのマイドキュメントの保存場所は、C\documents and setting\ユーザー名\ユーザー名 のドキュメント、になっているのに対し、パスの最後が、My Documents、というフォルダに保存されていることぐらいで、なぜ他のユーザーからアクセスできないのか、分かりません。

  • これらのファイルは削除しても大丈夫でしょうか?

    Norton AntiVirus 2003をだいぶ前にアンインストールしたのですが関連のファイルがまだ残っています。。。 Norton関係は全て削除しなければならないのですが、これらのファイル?は削除しても大丈夫でしょうか? (今は他社のソフトを使用しています) 場所→C:\Documents and Settings\ユーザー名\Cookies ファイル名?→ユーザー名@symantec[1] 場所→C:\Documents and Settings\ユーザー名\Local Settings\Temporary Internet Files ファイル名?→Cookie:ユーザー名@symantec.com/

  • sleipnirを使っています。メールのリンクをクリックしてもブラウザが起動しません。

    sleipnirを使用して、標準のブラウザにしています。 Outlook Expressのリンクをクリックすると C:\Documents and Settings\userが起動してしまいます。 この対応策は、ネットに沢山ありますが、 http://sleipnirfaq.hp.infoseek.co.jp/act.html#std_browse これらを試しても駄目です。 PCはXP Pro, sleipnir, OEは最新版です。 何かPCの設定がおかしいのでしょうか?

  • 実体のないISOについて

    会社がISO9001を取得しています。 「当社はISO9001に基づいて品質管理をしっかりしています」というのを売り物にしたいのでしょうが、現実的には社内でISOによる品質管理が有名無実化しているのが現状です。 社員数が少ないこともあり、ISOのマニュアル作りと書類作りに追われ、審査を通るためだけに、つまりISOの看板を取得するためだけにやっているのが現状です。 関係部署を順番に通らず、中身も見ないまま判子を押す書類関係。達成できることしか書かないマネジメントレヴュー、実質的な品質管理ができていないために出るミス・トラブル等、一部の幹部社員が会社の体面を繕うのにやっている状態で、サービス残業と無意味な書類ばかりが増えています。一部の人はISOの為に従来の仕事が全く出来てない状態です。 またISOの審査もかなりいい加減なもので、各部署1000枚を越える書類からの抜き取り検査は1枚だけ、審査員との応答もマニュアル通り進めていくだけの茶番劇です。 当然これらのことに時間とお金がかかるワケですが、中身のないISOを推し進めてまでやる意味が分かりません。社員としては品質管理をするならするで体面だけでなくキッチリやりたいと思っているのですが、本末転倒なISOを辞めるなり、キッチリやれるようにちゃんとした審査を行ってもらえるようにする方法はないのでしょうか?

専門家に質問してみよう