如何检测字符串是否包含任何从右到左的字符?

Ham*_*eni 9 java string right-to-left

我正在尝试创建一种方法来检测Java中从右到左书写的字符串.我想出了这个问题做的在C#中类似的东西.
现在我需要有类似的东西,但用Java编写.
任何帮助表示赞赏.

Ham*_*eni 11

我想出了以下代码:

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

它不是一种非常有效的方式,也不是一种准确的方法,但可以给出一个想法.

  • 你应该使用(c> = 0x5D0 && c <= 0x6ff)来包含希伯来语,它也是一种RTL语言. (9认同)

Dar*_*rko 9

问题很老但也许别人可能有同样的问题......

在尝试了几个解决方案后,我找到了适合我的解决方案:

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
}
Run Code Online (Sandbox Code Playgroud)

  • @Liggliluff没有标记,检测直接用在chars上,`Character.getDirectionality(char)` (2认同)

Ole*_* K. 7

这是 Darko 答案的改进版本:

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;
}
Run Code Online (Sandbox Code Playgroud)

此代码适用于以下所有情况:

???? ???               => true
good morning ???? ???  => false
???? ??? good morning  => true
good ???? ??? morning  => false
???? good morning ???  => true
(???? ???)             => true
Run Code Online (Sandbox Code Playgroud)