星号字母错误对齐java

星号字母错误对齐java,java,string,string-formatting,Java,String,String Formatting,当我以阿拉伯语查看文本向右对齐的列表项时,会出现错误的格式。 在所有阿拉伯语语句中,它都可以正常工作。[arWord].25.3但只有当文本为*时,它才是这样的。 结果:.22.1.* 代码: 预期的:*.22.1[左边的星号] 结果:.22.1.* 编辑: 这个问题也出现在像،'这样的其他角色身上 这是一个非常有趣的问题。我决定更多地玩弄它,是的,我可以在这里复制你的问题。我的take is*不是阿拉伯语文本,因此它不应用语言格式 以下是我的测试:- @Test public void tes

当我以阿拉伯语查看文本向右对齐的列表项时,会出现错误的格式。 在所有阿拉伯语语句中,它都可以正常工作。[arWord].25.3但只有当文本为
*
时,它才是这样的。 结果:
.22.1.*

代码:

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

结果
.22.1.*

编辑:
这个问题也出现在像،'这样的其他角色身上

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

以下是我的测试:-

@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中看到的进行比较,阿拉伯语文本显示为从右向左:-

更新

如果您只想始终首先显示
navText
,则可以使用库来执行此操作。这个图书馆似乎需要图书馆才能工作。。。是的,我知道它是用日语写的,我自己也不读日语。。。只需找到jsonic1.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);
        }
    }
}

请记住,此解决方案有点过火,可能会对非阿拉伯语语言产生意外的副作用。

在字母前添加此unicode
\u200F
字符可解决此问题。它强制从右向左执行任何操作:

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

换句话说,它很好用。arWord.25.3但是只有当文本是*时,它看起来像这样。是
navText
星号吗?是的。如果是星号,则会出现此问题。任何其他单词都可以很好地使用,星号是格式的最后一部分。如果你是这样想的,也许你应该把它放在前面,因为你认为问题是星号特定的或任何特殊的字符?但是这里的输出看起来是22.1.*,我需要它像阿拉伯字母一样是*.22.1。
arabicFormat = String.format(new Locale(Language.Arabic.getCode(),
                    Language.Arabic.getCountry()), "%d.%d.\u200F%s", 22,
                    1, navText);