2012-07-11 25 views
6

Tôi đang cố gắng thực hiện một phương pháp để phát hiện các chuỗi được viết bằng ngôn ngữ từ phải sang trái trong Java. Tôi đã đến với this question làm một cái gì đó tương tự trong C#.
Bây giờ tôi cần phải có một cái gì đó như thế nhưng được viết bằng Java.
Bất kỳ trợ giúp nào được đánh giá cao.Làm cách nào để phát hiện xem chuỗi có chứa bất kỳ ký tự Phải-Trái nào không?

Trả lời

10

tôi đã đưa ra đoạn mã sau:

char[] chars = s.toCharArray(); 
for(char c: chars){ 
    if(c >= 0x600 && c <= 0x6ff){ 
     //Text contains RTL character 
     break; 
    } 
} 

Đó không phải là rất hiệu quả hoặc cho rằng vấn đề một cách chính xác, nhưng có thể đưa ra một ý tưởng.

+7

Bạn nên sử dụng (c> = 0x5D0 && c <= 0x6ff) để bao gồm tiếng Do Thái, cũng là ngôn ngữ RTL. –

7

Câu hỏi là cũ nhưng có lẽ người khác có thể có cùng một vấn đề ...

Sau khi thử một số giải pháp tôi đã tìm thấy một trong đó làm việc cho tôi:

if (Character.getDirectionality(string.charAt(0)) == Character.DIRECTIONALITY_RIGHT_TO_LEFT 
    || Character.getDirectionality(string.charAt(0)) == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC 
    || Character.getDirectionality(string.charAt(0)) == Character.DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING 
    || Character.getDirectionality(string.charAt(0)) == Character.DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE 
    ) { 

    // it is a RTL string 
} 
+0

Điều này sẽ không hoạt động, vì văn bản RTL được viết mà không có các dấu này. – Liggliluff

1

Dưới đây là phiên bản cải tiến của câu trả lời Darko của:

public static boolean isRtl(String string) { 
    if (string == null) { 
     return false; 
    } 

    for (int i = 0, n = string.length(); i < n; ++i) { 
     byte d = Character.getDirectionality(string.charAt(i)); 

     switch (d) { 
      case DIRECTIONALITY_RIGHT_TO_LEFT: 
      case DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC: 
      case DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING: 
      case DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE: 
       return true; 

      case DIRECTIONALITY_LEFT_TO_RIGHT: 
      case DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING: 
      case DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE: 
       return false; 
     } 
    } 

    return false; 
} 

mã này làm việc cho tôi cho tất cả các trường hợp sau đây:

בוקר טוב    => true 
good morning בוקר טוב => false 
בוקר טוב good morning => true 
good בוקר טוב morning => false 
בוקר good morning טוב => true 
(בוקר טוב)    => true 
Các vấn đề liên quan