http://milines.egloos.com/viewer/3982536
import static org.junit.Assert.*;
import java.text.Normalizer;
import org.junit.Test;
public class KoreanNormalizeTest {
private void printIt(String string) {
System.out.println(string);
System.out.println("Len:" + string.length());
for (int i = 0; i < string.length(); i++) {
System.out.print(String.format("U+%04X ", string.codePointAt(i)));
}
System.out.println();
}
/**
* 참조 : http://helloworld.naver.com/helloworld/76650
*
* NFD : 조합형 NFC : 완성형
*/
@Test
public void test() {
String han = "한";
assertEquals("자바소스를 컴파일하면 기본적으로는 NFC 형태를 사용하기에 1글자", 1, han.length());
assertEquals(Integer.parseInt("D55C", 16), "한".codePointAt(0));
printIt(han);
String nfd = Normalizer.normalize(han, Normalizer.Form.NFD);
assertEquals("NFD 형식으로 분해하면 ㅎ ㅏ ㄴ 해서 3글자", 3, nfd.length());
assertEquals(Integer.parseInt("1112", 16), nfd.codePointAt(0));
assertEquals(Integer.parseInt("1161", 16), nfd.codePointAt(1));
assertEquals(Integer.parseInt("11AB", 16), nfd.codePointAt(2));
printIt(nfd);
String subHan = Normalizer.normalize("하", Normalizer.Form.NFD);
printIt(subHan);
assertTrue("NFD 로 분해하면 자소 단위의 비교가 가능하다. startsWith등을 이용해 자동완성 같은 기능에 쓸수 있다", nfd.startsWith(subHan));
String subHan2 = Normalizer.normalize("ㅎ", Normalizer.Form.NFD);
printIt(subHan2);
assertEquals("단, 단일 자소로 구성된 문자열을 NFD 로 노말라이즈를 해주지 못한다. 만약 NFD노말라이즈가 되었다면 코드 포인트가 1112 가 되어야 한다. ",
Integer.parseInt("314E", 16), subHan2.codePointAt(0));
String nfd2 = Normalizer.normalize(nfd, Normalizer.Form.NFD);
assertEquals("NFD 를 또 NFD 로 노말라이즈 해도 변화는 없다", 3, nfd2.length());
assertEquals(Integer.parseInt("1112", 16), nfd2.codePointAt(0));
assertEquals(Integer.parseInt("1161", 16), nfd2.codePointAt(1));
assertEquals(Integer.parseInt("11AB", 16), nfd2.codePointAt(2));
printIt(nfd2);
String nfc = Normalizer.normalize(nfd, Normalizer.Form.NFC);
assertEquals("NFD를 NFC 로 노말라이즈하면 다시 1글자", 1, nfc.length());
assertEquals(Integer.parseInt("D55C", 16), nfc.codePointAt(0));
printIt(nfc);
}
}
반응형
'차근차근 > JAVA JSP' 카테고리의 다른 글
[Java] Map, Table의 value 값 정렬 (0) | 2014.09.12 |
---|---|
StringTokenizer 와 String.split() (0) | 2014.09.11 |
java map 전체출력(Iterator 사용) (0) | 2014.09.11 |
ex16) java.io.* _Tokenizer + .hasMoreTokens() (0) | 2014.09.05 |
한글 인코딩의 이해 2편: 유니코드와 Java를 이용한 한글 처리 (0) | 2014.09.05 |