星号字母错误对齐java

时间:2014-01-19 10:52:49

标签: java string string-formatting

当我使用阿拉伯语查看右侧对齐文本的列表项时,会出现格式错误。 在所有阿拉伯语声明中,它运作正常。 [arWord] .25.3但只有在文本为*时才会出现这种情况。 结果:.22.1.*

CODE:

arabicFormat = String.format(new Locale(Language.Arabic.getCode(),
                    Language.Arabic.getCountry()), "%d.%d.%s",position,
                    (h.getSeq() + 1), navText);

预期*.22.1 [左侧的星号]

结果.22.1.*

编辑: 这个问题也出现在其他人物身上,'。

2 个答案:

答案 0 :(得分:4)

这是一个非常有趣的问题。我决定更多地玩它,是的,我可以在这里复制你的问题。我的看法是*不是阿拉伯语文本,因此它不会在其上应用语言格式。

以下是我的测试: -

@Test
public void testArabicLanguage() {
    // arabic
    assertThat(toArabicLanguage("قضاة وحقوقيون يكشفون "), is("22.1.قضاة وحقوقيون يكشفون "));

    // english
    assertThat(toArabicLanguage("hey"), is("22.1.hey"));

    // chinese
    assertThat(toArabicLanguage("现在进入"), is("22.1.现在进入"));

    // symbol
    assertThat(toArabicLanguage("*"), is("22.1.*"));
}

private String toArabicLanguage(String navText) {
    String s = String.format(new Locale("ar", "DZ"), "%d.%d.%s", 22, 1, navText);
    System.out.println(s);
    return s;
}

当我执行上述测试时,一切都过去了。

然而,当我直接在IntelliJ中查看控制台打印输出和测试时,我看到阿拉伯语文本从右向左显示。

每当我在这里复制并粘贴文本时,它总是从左到右显示。

这是控制台打印输出: -

22.1.قضاة وحقوقيون يكشفون 
22.1.hey
22.1.现在进入
22.1.*

现在,将它与我在IntelliJ中看到的相比,阿拉伯语文本从右向左显示: -

enter image description here enter image description here

<强>更新

如果您想要的是始终首先显示navText,则可以使用language-detection库来执行此操作。这个库似乎需要jsonic库才能使它工作......是的,我知道它是日语的,我自己也不读日语...只需查找jsonic 1.3 (1.3.0)并下载即可。

有了这个,你可以这样做: -

public class MyTest {

    // language-detection zip file comes with a `profile` dir... just point to it.
    @Before
    public void setup() {
        try {
            DetectorFactory.loadProfile("/path/to/language-detection/profiles");
        }
        catch (LangDetectException e) {
            fail("Can't locate the language profiles");
        }
    }

    @Test
    public void testArabicLanguage() {
        // arabic
        assertThat(toArabicLanguage("قضاة وحقوقيون يكشفون "), is("22.1.قضاة وحقوقيون يكشفون "));

        // english
        assertThat(toArabicLanguage("hey"), is("hey.22.1"));

        // chinese
        assertThat(toArabicLanguage("现在进入"), is("现在进入.22.1"));

        // symbol
        assertThat(toArabicLanguage("*"), is("*.22.1"));
    }

    private String toArabicLanguage(String navText) {
        boolean isArabicLanguage = false;

        try {
            Detector detector = DetectorFactory.create();
            detector.append(navText);

            isArabicLanguage = detector.detect().equals("ar");
        }
        catch (LangDetectException e) {
            // `*` will throw this exception:-
            // "com.cybozu.labs.langdetect.LangDetectException: no features in text"
            //
            // so, just catch it and treat it as non-Arabic language.
        }

        if (isArabicLanguage) {
            return String.format(new Locale("ar", "DZ"), "%d.%d.%s", 22, 1, navText);
        }
        else {
            return String.format("%s.%d.%d", navText, 22, 1);
        }
    }
}

请记住,此解决方案有点矫枉过正,可能会对非阿拉伯语言产生意想不到的副作用。

答案 1 :(得分:0)

问题通过在字母前添加此unicode \u200F字符来解决问题。它强制执行任何事情的权利:

arabicFormat = String.format(new Locale(Language.Arabic.getCode(),
                    Language.Arabic.getCountry()), "%d.%d.\u200F%s", 22,
                    1, navText);