• 締切済み

PHPでテキストファイルかどうかを判定する方法

基本的なことですが、PHPでテキストファイルかバイナリーファイかを判定する方法がわかりません。以下のperlコードをphpで書く方法を教えてください。 if( -T $filename ){ テキストファイルの処理 }else{ バイナリーファイルの処理 } マニュアル見ましたがよくわかりませんでした。よろしくお願いします。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

いっそ面倒なのでexecでfileを実行してみては? <? print exec("file xxx"); ?>

kahata
質問者

補足

ありがとうございますが如何なものでしょうか? binやshなど不用意にexecしてよいでしょうか? ascii,jis,uuc,sjis,utfのencodeを判定する方法はないかとも思ったのですが、これだと逆にbase64でcodingされた画像などがテキストファイルと判定されてしまいます。何かよいヒントがあれば教えてください。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 んと…そも「テキストファイルってなんですか?」という、かなり厄介な定義の問題になるのですが。 ちなみに。Perlのファイルテスト演算子 -T は、 「ファイルの最初の約1ブロック分のデータを調べて、コントロール文字や最上位ビットが立っている文字が多すぎる(30%より多い)ならバイナリファイル(-Bが真)、そうでなければテキストファイル(-Tが真)と判定する」とありますが(O'REILLY プログラミングPerl より)。 この条件だと「日本語(jis以外のエンコードが入っているファイル)は、高い確率で「バイナリ」になります。 多分、「テキスト or バイナリ」よりも、もう少しきめの細かいチェック&処理振り分けか、或いは逆に「画一的な処理」が必要になるのではないかと思うのですが如何でしょうか?

kahata
質問者

お礼

人間が読解可能なファイルをテキストファイルとしてPHPで処理したくperlの-Tを見つけましたが、ご指摘のとおり問題がありそうです。結局、拡張子で判断することにしました。万全でありませんが当面あきらめます。ありがとうございます。

kahata
質問者

補足

Cやjavaなどをcompileしたバイナリファイルのつもりだったのですが........ Perlのファイルテスト演算子 -Tの定義勉強になりました。eucやsjisまでバイナリと判定されるならこの演算子の使用を使うこと自体制限/問題があるようです。

関連するQ&A