2013-02-27 33 views
16

Có cách nào để xác định chuỗi là tiếng Anh hoặc tiếng Ả Rập không?Cách xác định chuỗi là tiếng Anh hoặc tiếng Ả Rập?

+3

Từ quan điểm của thế giới ngày nay, "1234" là cả hai tôi nghĩ? –

+0

@Nantant, tiếng Ả Rập có sử dụng số thường hoặc Rumi không? – paxdiablo

+1

Bạn có nghĩa là liệu nó có chứa văn bản tiếng Anh hoặc tiếng Ả Rập hay không hoặc liệu nó có được mã hóa theo cách đó không? Trường hợp thứ hai nên khá dễ dàng, vì các ký tự không nằm trong cùng một phạm vi Unicode (xem: http://en.wikipedia.org/wiki/Arabic_alphabet). – Martin

Trả lời

26

Đây là một logic đơn giản mà tôi chỉ cố gắng:

public static boolean isProbablyArabic(String s) { 
    for (int i = 0; i < s.length();) { 
     int c = s.codePointAt(i); 
     if (c >= 0x0600 && c <= 0x06E0) 
      return true; 
     i += Character.charCount(c);    
    } 
    return false; 
    } 

Nó tuyên bố văn bản như arabic khi và chỉ khi một điểm mã unicode arabic được tìm thấy trong văn bản. Bạn có thể nâng cao logic này để phù hợp hơn với nhu cầu của bạn.

Phạm vi 0600 - 06E0 là phạm vi điểm mã ký tự tiếng Ả Rập và các biểu tượng (Xem Unicode tables)

+1

Bạn cũng có thể muốn kiểm tra _other_ phạm vi tiếng Ả Rập - xem liên kết trong câu trả lời của tôi. – paxdiablo

+1

Phương pháp này rất không hiệu quả đối với các chuỗi lớn vì nó tính toán độ dài của chuỗi trong mỗi lần lặp. Character.codePointCount (s, 0, s.length()) đầu tiên được gán cho một biến để nó không gọi hàm này trong mỗi lần lặp. – Jazib

+0

@jazib: Tốt, cảm ơn. Tôi đã sửa mã cho phù hợp. –

0

Bạn có thể sử dụng Phân loại văn bản dựa trên N-gram (google cho cụm từ đó) nhưng không phải là kỹ thuật chống lỗi và có thể yêu cầu chuỗi không quá ngắn.

Bạn cũng có thể quyết định rằng một chuỗi chỉ có chữ cái ASCII không phải là tiếng Ả Rập.

+0

Nó cũng cần một số lượng đáng kể dữ liệu đào tạo (chưa kể thời gian đào tạo). – brimborium

3

Bạn thường có thể biết bằng các điểm mã trong chính chuỗi đó. Ả Rập chiếm certain blocks trong không gian mã Unicode.

Đó là một cược khá an toàn, nếu một tỷ lệ đáng kể các ký tự tồn tại trong các khối đó (chẳng hạn như بلدي الحوامات مليء الثعابينة), đó là văn bản tiếng Ả Rập.

+0

Bạn nên cung cấp một bản demo Java rất ngắn về ý tưởng của bạn. Nếu không, tôi nghĩ rằng đây là cách tốt nhất để đi trong trường hợp này (tiếng Anh vs arabic). – brimborium

-1

Hãy thử này:

internal static bool ContainsArabicLetters(string text) 

{ 

foreach (char character in text.ToCharArray()) 
{ 
    if (character >= 0x600 && character <= 0x6ff) 
     return true; 
    if (character >= 0x750 && character <= 0x77f) 
     return true; 
    if (character >= 0xfb50 && character <= 0xfc3f) 
     return true; 
    if (character >= 0xfe70 && character <= 0xfefc) 
     return true; 
} 
return false; 
} 
3

Một thay đổi nhỏ để trang trải tất cả các nhân vật arabic và biểu tượng dao động

private boolean isArabic(String text){ 
     String textWithoutSpace = text.trim().replaceAll(" ",""); //to ignore whitepace 
     for (int i = 0; i < textWithoutSpace.length();) { 
      int c = textWithoutSpace.codePointAt(i); 
      //range of arabic chars/symbols is from 0x0600 to 0x06ff 
      //the arabic letter 'لا' is special case having the range from 0xFE70 to 0xFEFF 
      if (c >= 0x0600 && c <=0x06FF || (c >= 0xFE70 && c<=0xFEFF)) 
       i += Character.charCount(c); 
      else     
       return false; 

     } 
     return true; 
     } 
4

Java tự hỗ trợ kiểm tra ngôn ngữ khác nhau bằng unicode, tiếng Ả Rập cũng được hỗ trợ. Cách đơn giản hơn và nhỏ nhất để thực hiện tương tự là bằng UnicodeBlock

public static boolean isTextContainsHindi(String text) { 
    for (char charac : text.toCharArray()) { 
     if (Character.UnicodeBlock.of(charac) == Character.UnicodeBlock.Ar) { 
      return true; 
     } 
    } 
    return false; 
} 
+1

Mã của bạn không phải là compilable trong trường hợp của tôi trừ khi tôi thay thế Character.UnicodeBlock.Ar với Character.UnicodeBlock.ARABIC, cũng vui lòng nhận thấy rằng tên phương pháp của bạn là sai isTextContainsHindi nó phải là isTextContainsArabic @Guarav Tyagi –

Các vấn đề liên quan