2017-02-14 8 views
2

저는 안드로이드에서 내 텍스트 프로세서를 만들고 있습니다 (몽골어 용 맞춤 세로 스크립트 TextView). 줄 바꿈을 구현할 수 있도록 모든 줄 바꿈 위치를 직접 찾아야한다고 생각했지만 BreakIterator을 발견했습니다. 이것은 다양한 언어로 문자, 단어, 선 및 문장 사이에 가능한 모든 중단을 찾는 것 같습니다.BreakIterator는 Android에서 어떻게 작동합니까?

나는 그것을 사용하는 법을 배우려하고있다. documentation은 평균보다 도움이되었지만 읽는 것만으로도 이해하기가 어려웠습니다. 또한 튜토리얼 (here, herehere 참조)을 찾았지만 찾고자하는 출력에 대한 설명이 부족했습니다.

나는이 Q를 더하고있다 & BreakIterator을 사용하는 방법을 배우는 스타일 답.

그들 사이에 apparently some difference이 있기 때문에이 태그를 Java 이외에 Android 태그로 만듭니다. 또한 Android는 이제 ICU BreakIterator을 지원하며 향후 답변을 통해이를 처리 할 수 ​​있습니다.

답변

4

BreakIterator은 문자, 단어, 줄 및 문장 사이에 가능한 구분을 찾기 위해 사용할 수 있습니다. 이는 보이는 문자를 통해 커서를 이동하고, 단어를 두 번 클릭하여 선택하고, 문장을 선택하기 위해 세 번 클릭하고, 줄 바꿈하는 것과 같은 작업에 유용합니다.

상용구 코드

다음 코드는 아래 예에서 사용된다. 첫 번째 부분을 조정하여 텍스트를 변경하고 BreakIterator 유형을 변경하십시오.

// change these two lines for the following examples 
String text = "This is some text."; 
BreakIterator boundary = BreakIterator.getCharacterInstance(); 

// boiler plate code 
boundary.setText(text); 
int start = boundary.first(); 
for (int end = boundary.next(); end != BreakIterator.DONE; end = boundary.next()) { 
    System.out.println(start + " " + text.substring(start, end)); 
    start = end; 
} 

그냥이를 테스트하려면

, 당신은 활동의 onCreate 안드로이드에 직접 붙여 넣을 수 있습니다. 나는 Log보다는 System.out.println을 사용하고 있기 때문에 Java 전용 환경에서도 테스트 할 수 있습니다.

저는 API24에서만 사용할 수있는 ICU 대신 java.text.BreakIterator을 사용하고 있습니다. 자세한 내용은 하단의 링크를 참조하십시오.

문자

변경 상용구 코드는

String text = "English中文123éé\uD83D\uDE00\uD83C\uDDEE\uD83C\uDDF3."; 
BreakIterator breakIterator = BreakIterator.getCharacterInstance(); 

다음과 같은 출력

0 H 
1 i 
2 
3 中 
4 文 
5 é 
6 é 
8 
10 
14 . 

가장 관심 부품, 인덱스 6, 8에 있으며 10을 포함합니다. 브라우저는 문자를 올바르게 표시 할 수도 있고 표시하지 않을 수도 있지만 사용자는 여러 UTF-16 값으로 구성되어 있어도 이들 모두를 단일 문자로 해석합니다.

단어

변경 상용구 코드는 다음을 포함합니다 :

String text = "I like to eat apples. 我喜欢吃苹果。"; 
BreakIterator boundary = BreakIterator.getWordInstance(); 

출력

0 I 
1 
2 like 
6 
7 to 
9 
10 eat 
13 
14 apples 
20 . 
21 
22 我 
23 喜欢 
25 吃 
26 苹果 
28 。 

여기에서 주목해야 할 몇 가지 흥미있는 일이 있습니다.첫째, 단어 분리는 공백의 양쪽에서 감지됩니다. 둘째, 다른 언어가 있더라도 여러 문자로 된 중국어 단어가 계속 인식됩니다. 로케일을 으로 설정 한 경우에도 내 테스트에서는 여전히 사실입니다.

라인

당신은 단어의 예와 같은 코드를 유지할 수 있습니다 :

0 I 
2 like 
7 to 
10 eat 
14 apples. 
22 我 
23 喜 
24 欢 
25 吃 
26 苹 
27 果。 

String text = "I like to eat apples. 我喜欢吃苹果。"; 
BreakIterator boundary = BreakIterator.getLineInstance(); 

출력 브레이크 위치가 텍스트의 전체 라인이 아니라는 것을. 그것들은 줄 바꿈 텍스트를 줄 수있는 편리한 장소입니다.

출력은 단어 예와 비슷합니다. 그러나 이제 공백과 구두점이 단어 앞에 포함됩니다. 새 줄을 공백이나 구두점으로 시작하지 않으려면이 말이 맞습니다. 또한 한자는 모든 문자에 줄 바꿈을 적용합니다. 이는 중국어로 여러 줄의 단어를 구분하는 것이 옳다는 사실과 일치합니다.

문장

변경 상용구 코드는 다음을 포함합니다 :

image to represent text output

올바른 문장 분할은 여러 언어로 인식되었다

String text = "I like to eat apples. My email is [email protected]\n" + 
     "This is a new paragraph. 我喜欢吃苹果。我不爱吃臭豆腐。"; 
BreakIterator boundary = BreakIterator.getSentenceInstance(); 

출력. 또한 전자 메일 도메인의 점에 대해 오 탐지 (false positive)가 발생하지 않았습니다.

노트

당신이 BreakIterator를 만들 때 당신은 Locale으로 설정할 수 있지만 그렇지 않은 경우 그냥 default locale을 사용합니다.

추가 읽기
  • ICU version of BreakIterator
  • This
  • +0

    중국어 텍스트를 단어로 분해하는 것이 올바르게 작동하지 않습니다. https://stackoverflow.com/questions/44507838/breakiterator-not-working-correctly-with-chinese-text에서 살펴볼 수 있습니까? – srgsanky