Windows + php 5.3.x で "表.txt" を読み書きする方法がありましたら教えてください。


以下にだめだった例を書きます。

>|php|
<?php
// 表.txt は存在する状態で
mb_internal_encoding('SJIS');

echo filesize('表.txt')); // これはOK。ファイルサイズが表示される

echo file_get_contents('表.txt'); // 失敗: failed to open stream: No such file or directory
// "表表.txt" が存在する場合は、その内容が表示される

file_put_contents('表.txt', '表も無敵だ'); // "表表.txt" が作成されてしまう
||<

回答の条件
  • 1人2回まで
  • 登録:2009/10/22 11:42:18
  • 終了:2009/10/28 13:50:29

回答(1件)

id:mattn No.1

mattn回答回数104ベストアンサー獲得回数232009/10/22 15:51:20

ポイント77pt

http://www.php.net/ URLダミー

ご存知かと思いますが、Shift_JISにおいて「表」は「0x95 0x5c」というバイト列で構成されています。

これを前提に

<?php
mb_internal_encoding('SJIS');
echo filesize('表.txt')); // これはOK。ファイルサイズが表示される
echo file_get_contents('表.txt');
?>

のfilesizeが動いてfile_get_contentsが動いていないのであれば、file_get_contentsのバグとしか考えられません。

おそらくfile_get_contentsがリモートコンテンツも取得出来る為、何かしらURLに関するエスケープが悪さをしているのだと思います。

バグが直るのを待つか、workaround的な物を見つけるしかありません。

"\x95\x5c.txt" と書いてみたり、何か設定で回避出来るかやってみましたが、mbstring.internal_encodingやmbstring.script_encoding等を変えてみても「表表.txt」が出来る結果には変わらなかったので、おそらく設定で直る物ではないかと思います。

id:gae

グハァ。 ありがとうございます。

2009/10/22 16:14:31
  • id:gae
    記法が反映されてないのはなぜ...
  • id:garyo
    「表」ということはだめ文字がらみ?


    http://ja.wikipedia.org/wiki/Shift_JIS
    >現在でも、シングルバイト文字コード対応のソフトウェアをShift_JIS環境で使用すると、改行などの動作やファイル名の処理などにしばしばこの問題がつきまとう。この不具合を招く、2バイト目に5C16を持つ文字のことを、だめ文字と呼び、この中には「ソ」「構」「能」「表」など一般に使用頻度の高い文字もある[8]。
  • id:gae
    その通りです。
    何か設定等で回避する方法があればと思って質問しました。
    私が確認した範囲では、stat()はうまく動くようですが fopen() file_exists() file_get_contents() file() などは
    期待通りに動きませんでした。
  • id:tdoi
    僕のところでは、5.3.0のvc9でビルドしたスレッドセーフ版を入れてみましたが、ちょっと違う挙動をしますね。

    質問のコードを実行すると、この時点ではファイルは何もないので、

    filesize、file_get_contentsは当然失敗します。
    その後、file_put_contentsで、表.txtというファイルが正しく生成されます。

    ところが、この状態で再度実行すると、

    filesize、file_get_contentsは、表.txtというファイルがあるにも関わらず失敗し、その上、file_put_contentsが、表表.txtというファイルを作成します。

    ここで、再度、実行すると、

    filesize、file_get_contentsは、表表.txtの内容を出力します。
    file_put_contentsも、表表.txtを書き換えていました。

    不思議な挙動ですね。
    せめて、初回実行時にfile_put_contentsが表表.txtを作成してくれれば、まだ、考えられそうなのですが・・・。
  • id:gae
    ありがとうございます。
    私も最初にスレッドセーフ版で試し、filemtime()が期待通りに動かずに困ったのですが、
    nts版を試すとこちらではうまく動いたため、それ以降スレッドセーフ版の動きについてはあまり確認していませんでした。

    また質問内容とはずれますが php6 には unicode.filesystem_encoding という設定があることがわかったので、
    もしかしたらこの問題が出ないのではないかと少し期待しましたが、やはり "表表.txt" が作成されてしまいました。
    確かにファイル名は script_encoding から filesystem_encoding へ変換されているようですが...。
  • id:gae
    ntsしか試していませんが、5.2.11 は OK で、
    5.3.0、5.3.1RC2 は NG でした。
  • id:Reiaru
    そもそもこれって PHP の問題なのでしょうか?
    サーバー上に全角文字を含んだファイル名のファイルを作るなんて事自体が恐ろしいのですが。
  • id:gae
    WindowsでもMacでもLinuxでも日常的に全角文字の含んだファイル名を扱っていますし、私は恐ろしくもなんともありません...。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません