Linux + phpで2バイト文字のパス指定

このQ&Aのポイント
  • RedHatLinux4 update6 + Apache2.2.8 + php5.2.5で2バイト文字を含むパスの指定方法について質問です。
  • phpで使用するパスに2バイト文字を含める場合、正しく動作しない問題が発生しています。
  • サーバのディレクトリ名を変更することはできず、2バイト文字を含むパスにアクセスする方法を教えてください。
回答を見る
  • ベストアンサー

Linux + phpで2バイト文字のパス指定

RedHatLinux4 update6 + Apache2.2.8 + php5.2.5でプログラムを作成しております。 //server/share/hogehoge を /opt/lampp/htdocs/share にcifsマウントして、サーバの"hogehoge"ディレクトリにある"補毛補毛"というディレクトリにアクセスできるようphpに記述したいのですが、うまくいかずに困っています。 /opt/htdocs/test.php ------------------------------------------------------------------- $glob="./hogehoge/補毛補毛"; chdir($glob);           //カレントディレクトリ移動 foreach (glob("*.xls") as $filepath) { echo "$filepath size " . filesize($filepath) . "\n"; } ------------------------------------------------------------------- 具体的には上記のようなソースを書いたのですがうまく動きませんでした。./hogehoge/までなら動くのですが、そこに2バイト文字を含めるとうまく動きません。 どうにかしてうまく動かす方法はありませんでしょうか。サーバ側のディレクトリ名を変更することはできません。 ご回答、宜しくお願いいたします。

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

質問者が選んだベストアンサー

  • ベストアンサー
  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.2

※ 基本的なことを書きますが、気分を害されないようお願いします。 まず日本語を扱うのが前提であれば mbstring は利用可能になっています でしょうか? > ローカルの端末やsshでは参照可能です。 > 2バイト文字などのファイル名も正常に表示されます。 echo $LANG を実行するとどうなっていましたかでしょうか? # Redhat4 のデフォルトは ja_JP.UTF-8 だと思いますが。 > しかし、phpだとうまくいきません。 PHP スクリプトのファイル名の文字のエンコードとシステムの文字エンコードが 合ってないという意味はご理解されていますでしょうか? cat /opt/htdocs/test.php とすると PHP スクリプトの日本語が化けませんか? 仮りに echo $LANG の時の結果が ja_JP.UTF-8 だとして PHP スクリプトファイルの文字エンコードが EUC-JP だとすると システムの文字エンコードと一致しないで見つけられないことになります。 言い替えれば、この場合は PHP スクリプトを UTF-8 でエンコードして あれば表示が可能だと言うことです。 EUC-JP の場合の方法はこんな感じかと思われます。 $glob="./hogehoge/補毛補毛"; mb_language("Japanese"); mb_internal_encoding("EUC-JP"); // PHP スクリプトファイルの文字エンコード $glob=mb_convert_encoding($glob, "UTF-8"); // システムの文字エンコード chdir($glob); //カレントディレクトリ移動 foreach (glob("*.xls") as $filepath) { $disp_filepath=mb_convert_encoding($filepath, "EUC-JP","UTF-8"); // 表示用に変換 echo "$disp_filepath size " . filesize($filepath) . "\n"; } Windows などで PHP スクリプトを編集していた場合は Shift_JIS になっていることが あるので、その場合は Shift_JIS または SJIS を指定します。 $glob="./hogehoge/補毛補毛"; mb_language("Japanese"); mb_internal_encoding("SJIS"); // PHP スクリプトファイルの文字エンコード $glob=mb_convert_encoding($glob, "UTF-8"); // システムの文字エンコード chdir($glob); //カレントディレクトリ移動 foreach (glob("*.xls") as $filepath) { $disp_filepath=mb_convert_encoding($filepath, "SJIS","UTF-8"); // 表示用に変換 echo "$disp_filepath size " . filesize($filepath) . "\n"; } 蛇足ですが cifs や smbfs でマウントした場合 mount に指定する iocharset に よっても変わりますが、ssh やローカル端末で化けないのであれば変更する必要は ありません。 変更しないほうが無難かと思われます。

tonpei3631
質問者

お礼

ご回答有り難う御座います。 早速、試してみましたところ解決いたしました。 低レベルな質問をして申し訳御座いません。 また、質問する機会がございましたら宜しくお願いいたします。 失礼いたします。

その他の回答 (1)

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.1

端末のシェル(bashなど)上で ls /opt/lampp/htdocs/share を実行した場合に漢字などの ファイル名の表示は正常でしたか? > そこに2バイト文字を含めるとうまく動きません。 ディレクトリ名で指定している文字エンコードとが合致しないだけかと思われますが? またディレクトリ名で扱う文字エンコードをお使いの環境変数 LANG と合わせても駄目なのでしょうか? # 私の環境で試した場合はエンコードが合えば可能でした。

tonpei3631
質問者

補足

ご回答ありがとうございます。 ローカルの端末やsshでは参照可能です。2バイト文字などのファイル名も正常に表示されます。しかし、phpだとうまくいきません。 下記のようなエラーメッセージが表示されてしまいます。 Warning: chdir() [function.chdir]: No such file or directory (errno 2) in /opt/lampp/htdocs/kanri/test.php on line 13 chdirがエラーを吐いているようです。

関連するQ&A

  • ファイルが移動できません。

    ファイルを移動しようとすると下記のように表示されます。 $ mv hello.php /opt/lampp/htdocs mv: `hello.php' を `/opt/lampp/htdocs/hello.php' に移動できません: 許可がありません 解決方法を教えてください。 お願いします。

  • cifsマウントで共有フォルダの中のディレクトリをマウント

    Rea Hat Enterprise Linux4 update6を使用しています。cifsマウントでwindows2000Serverの共有フォルダの中のディレクトリをマウントしたいのですが、出来ますでしょうか? 具体的には、 //server/share/hogehoge(共有フォルダ)/補毛補毛 の"補毛補毛"ディレクトリをLinuxの/media/windowsにマウントしたいのですが、うまくいきません。hogehogeまでならマウントできます。 なんとかして共有フォルダの中のディレクトリをマウントする方法はないでしょうか。ちなみにサーバ側はいじれません。 ご回答、よろしくお願いいたします。

  • Linuxで画像がアップロードできない

    いつもお世話になっております。 PHP初心者です。 現在、Linuxでサーバー構築をしているのですがWindowsでは問題の無かった画像のアップロードができません。 WindowsではXAMPP1.7.3を使用していました。 LinuxはCentOS5.4でXAMPP for Linux1.7.4を使用しています。 Windowsでは出ない以下のエラーが出ます。 ●Warning: move_uploaded_file(./book_picture/digi.jpg) [function.move-uploaded-file]: failed to open stream: 許可がありません in /opt/lampp/htdocs/sample23.php on line 24 ●Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpGDHAL8' to './book_picture/digi.jpg' in /opt/lampp/htdocs/sample23.php on line 24 php.iniのfile_uploadsはOnになっています。 php.iniのupload_max_filesize とpost_max_sizeは2Mと8Mになっています。 php.iniのupload_tmp_dirは設定されていないのでデフォルトの場所になっていると思います。 apacheを実行しているユーザで書き込みできなくなっているのでしょうか?一般ユーザではなく rootで入っていっるのですが。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP PEARのWeeks.phpの場所

    Fatal error: require_once() [function.require]: Failed opening required 'Calendar/Month/Weeks.php' (include_path='.:/php/includes:/usr/share/php/smarty') in /opt/lampp/htdocs/samples/chapter6/6-4/calendar_pear.php on line 8 というエラーが出ているので調べています。 PEARのCalendar/Month/Weeks.phpは、デフォルトではどこにインストールされるものなんでしょうか? PEARはインストールしてあって、pear install Calendar-0.5.5もやっていて、 pear install Calendar と打つと pear/Calendar is already installed and is the same as the released version 0.5.5 install failed と、既にインストールされてます、と出ます。 /usr/share/php/PEARが存在することは確認したのですが、find . "Weeks.php"と打っても 「find: `Weeks.php': そのようなファイルやディレクトリはありません」と出ます。 調べる方法があれば教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ディレクトリの所有者をXAMPPのapacheに

    Linux初心者です。 現在、CentOS5.4でLinuxサーバ構築の勉強をしています。 ディレクトリの所有者をXAMPP for Linux1.7.4のApacheに変更したいのですがイマイチやり方がわかりません。 変更したいディレクトリは book_picture というフォルダで /opt/lampp/htdocs/book_picture にあります。 ディレクトリの所有者を変更するにはchownコマンドというのを使うのは調べていてわかりましたが book_picture のファイル名が /opt/lampp/htdocs/book_picture だと上手くいきませんし、 XAMPP for Linux1.7.4のApacheのユーザー名もわかりません。 よろしくお願いします。 ちなみにディレクトリの所有者を変えてクライアント側からファイルのアップロードがしたいのです。 パーミッションを777にする方法ではできました。

  • path文字列の操作

    申し訳ありませんphp初心者です 教えていただけますか? $_SERVER['DOCUMENT_ROOT']; で取得した、 '/home/hogehoge/public_html' の 最後のディレクトリ分 を削除して '/home/hogehoge/' にしたいのですが、どのようにすれば良いでしょうか? よろしくおねがいします。

    • ベストアンサー
    • PHP
  • Subversionでエラー

    Subversionで 「svn: リポジトリは恒久的に 'http://localhost/svn/4514/' へ移動しました。relocate (参照 URL の変更) を実行してください」 というエラーが発生します。 OSはUbuntu 11.10です。LAMPP(XAMPP)を使っています。 Subversion自体は正常にインストールできたようです。 Subversion自体は/home/username/svnの下ではちゃんとaddとcommitが動きました。 設定には↓のサイトを参考にしました。 http://blog.riywo.com/2008/04/01/054421 ただ、それをhttp://localhost/svn/4514/の下でブラウザから動かしたいんです。 /opt/lampp/etc/httpd.confには DocumentRoot "/opt/lampp/htdocs" としてあります。ですから、/opt/lampp/htdocsがlocalhostです。 /opt/lampp/htdocs/svn/ というディレクトリを作成し、その下で sudo svnadmin create 4514 sudo chown -R www-data.www-data 4514/ sudo chmod 777 4514/ を実行しました。 http://localhost/svn/4514/にはブラウザから問題なくアクセスでき、ファイルの内容を見ることができます。 sudo vim /etc/apache2/mods-enabled/dav_svn.conf で以下のように編集しました: <location /svn> DAV svn # SVNParentPath "/home/username/svn" ←これがadd/commitが動いたディレクトリです SVNParentPath "/opt/lampp/htdocs/svn" # SVNParentPath "/opt/lampp/htdocs/svnrepository" </location> /home/username/sagyou/source の下には"Hello World!"と書かれたfirst.txtというファイルが作ってあります。 これで svn import ~/sagyou/source http://localhost/svn/4514/ -m "first import" と実行すれば、/4514の下に~/sagyou/source/first.txtがコピーされるはずなんですが、 「svn: リポジトリは恒久的に 'http://localhost/svn/4514/' へ移動しました。relocate (参照 URL の変更) を実行してください」 というエラーが発生します。 このエラーに関するサイトを10個は読んだのですが、まったく意味が分かりません(具体的な例が分かりません)。特に↓ここです: http://www.hinet.mydns.jp/tdiary/?date=20050317#p02 SVNParentPath "/opt/lampp/htdocs/svnrepository"に変えてみても同じです。 ちなみに、DocumentRootは変えたくありません、既にその下にPHPのファイルなどを入れているからです。 もう昨日からずっとやっているのに解決できません。でも、あと一歩のような気がします。必要であれば補足します。試してほしい操作があればやります。どんな小さなヒントでもいいので、どうかお助けください。お願いします。

  • PHPの実行の際、パスが化ける

    WindowXPでApache+PHPでサーバのテストをしています。 実行はHTMLで記述して、クイックすると ↓の文字が実行されるようにしています。 C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test\1-9\追加コピー\192.php 実行すると下記のエラーが出ます。 Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0 Fatal error: Unknown: Failed opening required 'C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test/1-9/霑ス蜉繧ウ繝斐・/172.php' (include_path='.;C:\Program Files\PHP5\pear;c:\Program Files\php5\includes') in Unknown on line 0 ---------------------------- つまり、ホルダー名:追加コピー、の部分が化けてしまいます。 これを回避する何か方法はあるのでしょうか よろしくお願いします。

    • ベストアンサー
    • PHP
  • Apacheの設定について

    OSはRedhatLinux7.1 Apache_1.3.26 php-4.2.3 mysql-3.23.52 を使っています。 WebサーバにApacheを使っており、 今は /usr/local/apache/htdocs の下に直接ファイルやディレクトリを置いてブラウザから見ています。 しかし、例えば、 /home/master/public_html の下に置いてあるファイルやディレクトリもブラウザから見えるようにするにはどのようにすればよいのですか? apacheの設定を変えればよいのかなと思うのですが、どこをどのように変えればよいのかわからず困っています。 アドバイスお願いします。

  • PHP CSV 出力

    失礼します。 現在PHPで指定したパスに置いてあるCSVを出力したいのですが、 CSVは出力できているのですが、HTMLが先頭に入ってしまいます。 htmlファイルに設置したボタンに対して phpファイルで処理をしています。 どこかおかしい部分があればご教授頂きたいです。 HTMLファイル <?php $self = $_SERVER["SCRIPT_NAME"]; ?> <form method='POST' action='<?php $self ?>'> <input type='submit' value='CSV出力' name='get_csv'> </form> PHPファイル function This_Month(){ $filepath = 'hoge.csv'; //ダウンロードしたいファイルパス $filename = 'test.csv'; //ダウンロードした際のファイル名 if(!file_exists($filepath)){ die("Error:File(".$filepath.") does not exist"); } //オープンできるか確認 if(!($fp = fopen($filepath,"r"))) { die("Error:Cannot open the file(".$filepath.")"); } fclose($fp); //ファイルサイズの確認 if(($content_length = filesize($filepath)) == 0){ die("Error:File size is 0.(".$filepath.")"); } //ファイルの処理方法 header('Content-Disposition: attachement; filename="'.$filename.'"'); //ファイルタイプ指定 header('Content-Type: application/octet-stream'); header('Content-Transfer-Encoding:binary'); //ファイルサイズ header('Content-Length: '.filesize($filepath)); mb_convert_encoding($filepath,'utf-8','shift-jis'); readfile($filepath); exit(); } //ボタンに合わせて条件を変えていく if(isset($_POST["get_csv"])){ //ユーザーから来たデータをエスケープする $csv_output = htmlspecialchars($_POST["get_csv"], ENT_QUOTES, "UTF-8"); switch ($csv_output) { case "CSV出力": ”This_Month();  break; default: echo "エラー"; exit; } }

    • ベストアンサー
    • PHP

専門家に質問してみよう