2014-01-19 4 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

업데이트

항상 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

문제 문자 앞에이 유니 코드 \u200F 문자를 추가하여 해결되었습니다. 그것은 무엇이든을 위해 좌측에 권리를 실시했다 :

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