10

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

4

4 回答 4

13

我想出了以下代码:

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

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

于 2012-07-16T10:42:23.757 回答
12

问题很旧,但也许其他人可能有同样的问题......

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

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
}
于 2015-07-20T13:17:37.853 回答
8

这是达科答案的改进版本:

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
于 2017-03-07T16:32:16.850 回答
0

也许这应该有所帮助:

http://en.wikipedia.org/wiki/Right-to-left_mark

当存在 rtl 字符串时,应该有一个 Unicode 字符,即 U+200F。

问候

于 2012-07-11T13:08:34.567 回答