「平成」を感じるもの

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バイト文字を含めるとうまく動きません。

どうにかしてうまく動かす方法はありませんでしょうか。サーバ側のディレクトリ名を変更することはできません。

ご回答、宜しくお願いいたします。

A 回答 (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 やローカル端末で化けないのであれば変更する必要は
ありません。 変更しないほうが無難かと思われます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/04/14 09:21

端末のシェル(bashなど)上で ls /opt/lampp/htdocs/share を実行した場合に漢字などの


ファイル名の表示は正常でしたか?

> そこに2バイト文字を含めるとうまく動きません。

ディレクトリ名で指定している文字エンコードとが合致しないだけかと思われますが?
またディレクトリ名で扱う文字エンコードをお使いの環境変数 LANG と合わせても駄目なのでしょうか?

# 私の環境で試した場合はエンコードが合えば可能でした。

この回答への補足

ご回答ありがとうございます。
ローカルの端末や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がエラーを吐いているようです。

補足日時:2008/04/10 11:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報