1

パス内の特定のファイルのタイプがテキスト ファイルであること、つまりバイナリではないこと、つまり人間が読み取れることを確認したいと考えています。私は最初の文字を読んで推測し、各文字を次のようにチェックします:

  • isAlphaNumeric
  • は特別です
  • isSeparator
  • isOctetCharacter ???

しかし、これらすべてのテスト方法を and: [ ... and: [ ... and: [ ] ] ] で結合することは、あまりおしゃべりではないようです。よりエレガントな方法の提案はありますか?

(Python のバージョンがここにあり、 Pythonを使用してバイナリ ファイルとテキスト ファイルを識別する方法は?これは便利ですが、構文と実装は C のように見えます。)

4

2 に答える 2

1

ヒューリスティックのみ。あなたは本当に確信することはできません...

ascii の場合、次のようにすることができます。

|isPlausibleAscii numChecked|

isPlausibleAscii := 
    [:char |
        ((char codePoint between:32 and:127)
        or:[ char isSeparator ])
    ].

numChecked := text size min: 1024.
isPossiblyText := text from:1 to:numChecked conform: isPlausibleAscii.

Unicode (UTF8 ?) の場合、事態はさらに難しくなります。その後、変換を試みることができます。変換エラーがある場合は、バイナリを想定します。

PS: from:to:conform: がない場合は、(copyFrom:to:) conform: に置き換えます。

PPS: conform: がない場合は、allSatisfy: を試してください。

于 2012-06-04T21:44:35.037 に答える
0

すべてのテキストには、バイナリ ファイルで予想されるよりも多くのスペースが含まれており、一部のエンコーディング (UTF16/32) には、一般的な言語の 0 が多数含まれています。些細な解決策は、Standard/MultiByte-FileStream のメソッドで悲惨な詳細を非表示にすることです。#isProbablyText はおそらく適切な選択です。

基本的には次のことを行います: - 後で使用する場合は現在の状態を保存し、リセットして開始します (MultiByteStream を使用する場合は Latin1 コンバーターを設定します)。

  • 次の N 文字を繰り返し処理します (N は適切な数値です)。

  • 印刷できないASCII文字に遭遇しましたか? おそらくバイナリなので、false を返します。(特別なセレクターではなく、マップを使用し、キャラクターなどに新しいメソッドを実装します)

  • 必要に応じて 2 つのカウンターを増やします。1 つはスペース文字用、もう 1 つはゼロ文字用です。

  • ループが終了したら、いずれかのカウンターが統計的に有意な量を読み取ったかどうかを返します

TLDR; 方法を使用して、悲惨な詳細を非表示にします。それ以外の場合は、ほとんど同じです。

于 2011-08-12T07:57:45.743 に答える