2014-01-19 139 views
3

當我用阿拉伯文查看右對齊的文本列表項時,出現錯誤的格式。 在所有阿拉伯語聲明中,它工作正常。 [arWord] .25.3,但只有當文本是*它看起來像這樣。 結果:.22.1.*星號字母錯誤對齊java

CODE:

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

預期*.22.1 [星號在左]

結果.22.1.*

編輯: 問題也出現與其他字符如''。

+0

在其他阿拉伯文字它工作正常。 arWord.25.3但只有當文本是*它看起來像這樣。 – MSaudi

+0

是'navText'星號嗎? –

+0

是的。如果是星號,則會出現此問題。任何其他單詞都可以正常工作 – MSaudi

回答

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

UPDATE

如果你全部首先想要的是始終顯示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); 
     } 
    } 
} 

請記住這個解決方案是有點矯枉過正,而且可能對非阿拉伯語意想不到的副作用。

+0

但這裏的輸出看起來是22.1。*,我需要它是* .22.1,就像阿拉伯字母一樣。 – MSaudi

+0

哦,我在這裏看到你的編輯。看起來不錯。我會試一試。 – MSaudi

0

問題通過在字母前加上這個unicode \u200F字符來解決。它強制執行任何東西的權利:

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