Làm cách nào tôi có thể tìm thấy các ký tự không phải ASCII trong tệp văn bản?


5

Có một công cụ có thể quét một tệp văn bản nhỏ và tìm kiếm bất kỳ ký tự nào không có trong bộ ký tự ASCII đơn giản không?

Một tập lệnh Java hoặc Groovy đơn giản cũng sẽ làm được.


Nó có thể được chuyển đến đó, mặc dù sẽ nghĩ rằng điều này sẽ được các lập trình viên quan tâm trực tiếp trong quá trình thực hiện một số nhiệm vụ lập trình .. (chẳng hạn như tôi đang ở ngay bây giờ)
Marcus Leon

Đây không phải là một câu hỏi lập trình, và do đó không có chủ đề. Bạn đã ở đây đủ lâu để biết điều đó, nhưng nếu không, vui lòng đọc FAQ để biết thông tin về những câu hỏi có chủ đề ở đây. :)
Ken White

Tất nhiên bạn có thể sử dụng grepvới một lớp nhân vật phủ định.
Tom Zych

Bất cứ điều gì sẽ không đi theo con đường grep '[^\x00-\xFF]'hoặc tương đương đạo đức của nó bằng cách sử dụng các công cụ hiện có không viết một chương trình mới là không có gì ngoài sự điên rồ quá mức.
tchrist

@tchrist, điểm tốt. Mặc dù tôi đang gặp vấn đề với điều đó - stackoverflow.com/questions/7258299/ Kẻ
Marcus Leon

Câu trả lời:


2

Chà, nó vẫn ở đây sau một giờ, vì vậy tôi cũng có thể trả lời nó. Đây là một bộ lọc đơn giản chỉ in các ký tự không phải ASCII từ đầu vào của nó và cung cấp mã thoát 0 nếu không có bất kỳ và 1 nếu có. Chỉ đọc từ đầu vào tiêu chuẩn.

#include <stdio.h>
#include <ctype.h>

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

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

    return flag;
}

Cảm ơn, tình cờ có phiên bản Java? :)
Marcus Leon

Không, đừng làm Java, xin lỗi.
Tom Zych

1
@Marcus: Chủ nghĩa độc quyền cũng lành mạnh về môi trường như mọi hoạt động độc canh khác.
tchrist

1

Chỉ cần chạy $ JDK_HOME / bin / igen2ascii trên tệp văn bản và tìm kiếm "\ u" trong tệp đầu ra. Tôi giả sử bạn muốn tìm nó để bạn có thể thoát khỏi nó và điều này sẽ giúp bạn tiết kiệm một bước. ;)


0

Tôi không biết điều này có hợp pháp hay không, chuyển từng char thành int và sử dụng lệnh bắt để xác định những thứ không thành công. Tôi cũng quá lười để viết cái này trong java nên có một số Groovy

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

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

==> Ã Â ç


0

Trong Java (giả sử chuỗi được chỉ định làm đối số dòng lệnh đầu tiên:

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();
    }
}

Để làm điều này của riêng bạn, thay thế stringToSearchbằng bất cứ điều gì bạn cần.


0

Một ví dụ đơn giản:

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"
    }
}

Nó đơn giản như bit này ở đây: it ==~ /[\x00-\x7F]*/

Chỉnh sửa: Tôi quên bao gồm một phiên bản cho các tập tin. Úi:

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)
}

Phiên bản đó có thể được sử dụng làm tập lệnh dòng lệnh và bao gồm trạng thái thoát để có thể bị xiềng xích.


Nó không có nghĩa gì để đọc toàn bộ tập tin vào bộ nhớ. Lưu ý rằng MỌI SINGLE STRING EVER CREATED khớp với một cái gì đó giống như /[\x00-\xFF]*/, giống như mọi chuỗi đơn lẻ cũng khớp /a*/, thậm chí "xxx". Không hoặc nhiều hơn có nghĩa là bạn hài lòng với 0. Và /[\x80-\xFF]/không phải là ASCII! Bạn cần phải phù hợp /^[\x00-\x7F]+$/để trở thành tất cả ASCII. Một công cụ regex bình thường với sự hỗ trợ Unicode cơ bản nhất sẽ chỉ sử dụng \p{ASCII}so với \P{ASCII}.
tchrist

@tchrist Mình đánh giá cao phản hồi. Tất nhiên, nó sẽ hiệu quả hơn để truyền phát tệp. Tuy nhiên, câu hỏi ban đầu đặc biệt hỏi về việc quét một tệp nhỏ . Nhận xét của bạn về regex là không chính xác, đơn giản là do thực tế là tôi đã kiểm tra mã của mình trước khi tôi đăng nó. Xin lỗi nếu phạm vi của tôi không chính xác - đó có thể là một nhận xét hợp lệ, nhưng nhận xét của bạn là không cần thiết và thô lỗ. Tôi chỉ đơn giản là cung cấp một ví dụ dựa trên Groovy hoạt động, vì câu hỏi đã đề cập đến nó.
Quá nhiệt

Ngoài ra, bạn phải khớp chuỗi trống hoặc các tệp trống sẽ hiển thị dưới dạng không phải ASCII. Tôi nghĩ đó là hành vi không chính xác.
OverZealous

Không, ASCII là mã điểm 0 đến 127. Mẫu của bạn khớp từ 0 đến 255. Do đó, điều đó là sai.
tchrist

Tôi không nên trả lời, nhưng tôi cần chỉ ra hai điều: Thứ nhất, bạn có thể chỉ cần chỉ ra điều đó và đề xuất cách khắc phục, và tôi sẽ cập nhật đề xuất của mình. Đó là cách StackExchange hoạt động - câu trả lời có thể được chỉnh sửa và làm sạch. Thứ hai, thật buồn cười khi bạn thực hiện một thỏa thuận lớn như vậy về phạm vi, vì đó chính xác là phạm vi mà bạn đề xuất ở trên! Mặc dù vậy cũng không sao, tôi hiểu rằng bạn thà hạ gục ai đó còn hơn là hữu ích.
OverZealous
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.