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

11

我正在尝试在Java中创建一种检测从右到左书写语言的字符串的方法。 我已经找到了一个类似于C#的实现,具体请参考此问题
现在我需要类似于该实现但是用Java编写。
感谢任何帮助。

4个回答

13

我想出了以下代码:

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

这并不是一种非常有效的方法,也不能说是准确的方式,但可以给人一些想法。


15
你应该使用(c >= 0x5D0 && c <= 0x6ff)来包含希伯来语,它也是一种从右到左书写的语言。 - Ron Tesler

13

问题可能很旧,但可能有其他人遇到了同样的问题...

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

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
}

这是行不通的,因为RTL文本是没有这些标记的。 - Liggliluff
2
@Liggliluff,没有标记,检测直接用于字符,Character.getDirectionality(char) - cdalxndr

9
以下是对Darko的答案进行改进后的版本:

以下是对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;
}

这段代码对以下所有情况都适用:

בוקר טוב               => true
good morning בוקר טוב  => false
בוקר טוב good morning  => true
good בוקר טוב morning  => false
בוקר good morning טוב  => true
(בוקר טוב)             => true

0

"\u05D0\u05D2" 被显示为反向,没有任何 RTL 标记。 - cdalxndr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接