- 締切済み
PHPでテキストファイルかどうかを判定する方法
基本的なことですが、PHPでテキストファイルかバイナリーファイかを判定する方法がわかりません。以下のperlコードをphpで書く方法を教えてください。 if( -T $filename ){ テキストファイルの処理 }else{ バイナリーファイルの処理 } マニュアル見ましたがよくわかりませんでした。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
いっそ面倒なのでexecでfileを実行してみては? <? print exec("file xxx"); ?>
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 んと…そも「テキストファイルってなんですか?」という、かなり厄介な定義の問題になるのですが。 ちなみに。Perlのファイルテスト演算子 -T は、 「ファイルの最初の約1ブロック分のデータを調べて、コントロール文字や最上位ビットが立っている文字が多すぎる(30%より多い)ならバイナリファイル(-Bが真)、そうでなければテキストファイル(-Tが真)と判定する」とありますが(O'REILLY プログラミングPerl より)。 この条件だと「日本語(jis以外のエンコードが入っているファイル)は、高い確率で「バイナリ」になります。 多分、「テキスト or バイナリ」よりも、もう少しきめの細かいチェック&処理振り分けか、或いは逆に「画一的な処理」が必要になるのではないかと思うのですが如何でしょうか?
お礼
人間が読解可能なファイルをテキストファイルとしてPHPで処理したくperlの-Tを見つけましたが、ご指摘のとおり問題がありそうです。結局、拡張子で判断することにしました。万全でありませんが当面あきらめます。ありがとうございます。
補足
Cやjavaなどをcompileしたバイナリファイルのつもりだったのですが........ Perlのファイルテスト演算子 -Tの定義勉強になりました。eucやsjisまでバイナリと判定されるならこの演算子の使用を使うこと自体制限/問題があるようです。
補足
ありがとうございますが如何なものでしょうか? binやshなど不用意にexecしてよいでしょうか? ascii,jis,uuc,sjis,utfのencodeを判定する方法はないかとも思ったのですが、これだと逆にbase64でcodingされた画像などがテキストファイルと判定されてしまいます。何かよいヒントがあれば教えてください。