テキストファイルでASCII以外の文字を見つける方法はありますか。

小さなテキストファイルをスキャンして、単純なASCII文字セット以外の文字を探すことができるツールはありますか。

単純なJavaまたはGroovyスクリプトでも可能です。

5
もちろん、無効な文字クラスを持つ grep を使うこともできます。
追加された 著者 Nicolas Lefebvre,
@tchrist:ASCIIは00から7Fまで実行されませんか?
追加された 著者 Nicolas Lefebvre,
それはそこに移動することができますが、これは特定のプログラミングタスクのプロセスにおいてプログラマーにとって直接的な関心事になると思います。
追加された 著者 Sumurai8,
@ tchrist、良い点私はそれで問題を抱えているが -
これはプログラミングの問題ではないので、トピック外です。あなたはそのことを知るのに十分な時間がありましたが、そうでない場合は、ここでどのような質問が話題になっているかについての情報について FAQ を読んでください。 :)
追加された 著者 Ether Frog,
grep '[^ \ x00- \ xFF]' またはその道徳的な同等物新しいプログラムを書かないで既存のツールを使うの道をたどるつもりがないことは何もないしかし、非常識なやり過ぎです。
追加された 著者 tchrist,
/ [^ \ x00- \ xFF]/'の場合は、 grep -P' [^ \ x00- \ xFF] 'または perl -ne'を使用してください。 grepの -P オプションは実際のPerl正規表現を実際には受け入れないことに注意してください。
追加された 著者 tchrist,
@トム:うん。私は、OPがしたことをまねただけでした。
追加された 著者 tchrist,

5 答え

1時間経ってもまだここにあるので、私はそれに答えることもできます。これは、その入力からASCII以外の文字のみを出力する単純なフィルタです。存在しない場合は終了コード0、存在しない場合は終了コード1を返します。標準入力からのみ読み取ります。

#include 
#include 

int main(void)
{
    int c, flag = 0;

    while ((c = getchar()) != EOF)
        if (!isascii(c)) {
            putchar(c);
            flag = 1;
        }

    return flag;
}
2
追加された
いや、Javaをしないで、すみません。
追加された 著者 Nicolas Lefebvre,
ありがとう、Javaバージョンを持っているのですか? :)
追加された 著者 Sumurai8,
@マルカス:モノリンガリズムは、他のモノカルチャーと同じくらい環境的に健康です。
追加された 著者 tchrist,

テキストファイルで$ JDK_HOME/bin/native2asciiを実行し、出力ファイルで「\ u」を検索するだけです。私はあなたがとにかくそれを逃れることができるようにあなたがそれを見つけたいと思っていると思います、そしてこれはあなたに一歩を省くでしょう。 ;)

1
追加された

Javaでは(文字列が最初のコマンドライン引数として指定されていると仮定します。

public class Main
{
    public static void main(String[] args)
    {
        String stringToSearch = args[0];
        int len = stringToSearch.length();
        for (int i = 0; i < len; i++)
        {
            char ch = stringToSearch.charAt(i);
            if (ch >= 128)//non-ascii
            {
                System.out.print(ch + " ");
            }
        }
        System.out.println();
    }
}

これを自分のものにするには、 stringToSearch を必要なものに置き換えます。

0
追加された

簡単でグルーヴィーな例:

def str = [ "this doesn't have any unicode", "this one does ±ÁΘ·€ÔÅ" ]

str.each {
    if( it ==~ /[\x00-\x7F]*/ ) {
        println "all ascii: $it"
    } else {
        println "NOT ASCII: $it"
    }
}

It's as simple as this bit here: it ==~ /[\x00-\x7F]*/

編集:私はファイルのバージョンを含めるのを忘れていました。おっとっと:

def text = new File(args[0]).text
if( text ==~ /[\x00-\x7F]*/ ) {
    println "${args[0]} is only ASCII"
    System.exit(0)
} else {
    println "${args[0]} contains non-ASCII characters"
    System.exit(-1)
}

そのバージョンはコマンドラインスクリプトとして使用することができ、それが連鎖することができるように終了ステータスを含みます。

0
追加された
@ tchristフィードバックをありがとうございます。もちろん、ファイルをストリーミングする方が効率的です。ただし、元の質問では、特に小さなファイルのスキャンについて質問されました。正規表現についてのあなたのコメントは間違っています。それは、投稿する前に私が実際に自分のコードをテストしたからです。私の範囲が正しくない場合は申し訳ありません - それは有効なコメントかもしれませんが、あなたのコメントは不必要に攻撃的で失礼です。質問で言及されているので、私は単純に実用的なGroovyベースの例を提供していました。
追加された 著者 Chris Page,
また、空の文字列と一致させる必要があります。そうしないと、空のファイルが非ASCII文字として表示されます。それは間違った振る舞いだと思います。
追加された 著者 Chris Page,
私は反応を気にするべきではありませんが、私は2つのことを指摘する必要があります:第一に、あなたは単にそれを指摘し、修正を提案することができました。それがStackExchangeのしくみです。答えは編集して整理することができます。第二に、それはあなたが範囲についてそれほど大したことをしているのは面白いことです。それは大丈夫です、私はあなたがむしろ役に立つよりもむしろ誰かをノックダウンすることを理解しています。
追加された 著者 Chris Page,
ファイル全体をメモリに読み込むことは意味がありません。すべての1つの文字列も/a */<と一致するのと同様に、すべての単一文字列を作成した/[\ x00- \ xFF] */のようなものに一致します/ code>、さらに "xxx" まで。ゼロ以上の場合、コンテンツは0になります。/[\ x80- \ xFF]/はASCIIではありません。すべてASCIIになるには、/^ [\ x00- \ x7F] + $/に一致する必要があります。最も基本的なUnicodeをサポートする通常の正規表現エンジンは単に \ p {ASCII} vs \ P {ASCII} を使います。
追加された 著者 tchrist,
いいえ、ASCIIはコードポイント0から127です。あなたのパターンは0から255に一致します。したがって、間違っています。
追加された 著者 tchrist,

これが合法であるかどうかはわかりません。各文字をintにキャストし、キャッチを使用して失敗したものを識別します。私はこれをJavaで書くのも面倒だから、Groovyを持っている

def chars = ['Ã', 'a', 'Â', 'ç', 'x', 'o', 'Ð'];

chars.each{
    try{ def asciiInt = (int) it }
    catch(Exception e){ print it + " "}
}

==> Ã Â ç Ð

0
追加された