자바 한글 UTF Normalize 예제 기술

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);

}

}