sitelink1  
sitelink2  
sitelink3  
sitelink4  
sitelink5  
sitelink6  

import java.text.Normalizer;

import java.util.ArrayList;

import java.util.List;

 

public class UnicodeUtils {

 

    private static final int HANGEUL_BASE = 0xAC00; // '가'

    private static final int HANGEUL_END = 0xD7AF;

    // 이하 cho, jung, jong은 계산 결과로 나온 자모에 대해 적용

    private static final int CHO_BASE = 0x1100;

    private static final int JUNG_BASE = 0x1161;

    private static final int JONG_BASE = (int) 0x11A8 - 1;

    // 이하 ja, mo는 단독으로 입력된 자모에 대해 적용

    private static final int JA_BASE = 0x3131;

    private static final int MO_BASE = 0x314F;

 

    /**

     * 단어를 초성,중성,종성으로 분리후 char리스트로 리턴(공백포함됨) <br/>

     * 공백의 경우 charcode 32가 출력됨(160아님)<br/>

     * 받침이 없는 글자의 경우 마지막에 charcode 0이 붙게됨<br/>

     * (참고 : https://gist.github.com/thirdj/5333532 초성 중성 종성 분리 하기)<br/><br/>

     * 유니코드 한글은 0xAC00 으로부터 초성 19개, 중상21개, 종성28개로 이루어지고 이들을 조합한 11,172개의 문자를 갖는다. <br/>

     * 한글코드의 값 = ((초성 * 21) + 중성) * 28 + 종성 + 0xAC00 (0xAC00은 'ㄱ'의 코드값) <br/>

     * 따라서 다음과 같은 계산 식이 구해진다. 유니코드 한글 문자 코드 값이 X일 때, <br/>

     * 초성 = ((X - 0xAC00) / 28) / 21 중성 = ((X - 0xAC00) / 28) % 21 종성 = (X - 0xAC00) % 28 <br/>

     * 이 때 초성, 중성, 종성의 값은 각 소리 글자의 코드값이 아니라 이들이 각각 몇 번째 문자인가를 나타내기 때문에 다음과 같이 다시 처리한다. <br/>

     * 초성문자코드 = 초성 + 0x1100 //('ㄱ') 중성문자코드 = 중성 + 0x1161 // ('ㅏ') 종성문자코드 = 종성 + 0x11A8 - 1 // (종성이 없는 경우가 있으므로 1을 뺌)

     * @param text

     * @return

     */

    public static List<Character> normalizeToChars(String text) {

 

        List<Character> list = new ArrayList<>();

 

        for (char c : text.toCharArray()) {

            if ((c <= 10 && c <= 13) || c == 32) {

                list.add(c);

                continue;

            } else if (c >= JA_BASE && c <= JA_BASE + 36) {

                list.add(c);

                continue;

            } else if (c >= MO_BASE && c <= MO_BASE + 58) {

                list.add((char) 0);

                continue;

            } else if (c >= HANGEUL_BASE && c <= HANGEUL_END) {

                int choInt = (c - HANGEUL_BASE) / 28 / 21;

                int jungInt = ((c - HANGEUL_BASE) / 28) % 21;

                int jongInt = (c - HANGEUL_BASE) % 28;

                char cho = (char) (choInt + CHO_BASE);

                char jung = (char) (jungInt + JUNG_BASE);

                char jong = jongInt != 0 ? (char) (jongInt + JONG_BASE) : 0;

 

                list.add(cho);

                list.add(jung);

                list.add(jong);

            } else {

                list.add(c);

            }

 

        }

        return list;

    }

    

    /**

     * 단어를 초성,중성,종성으로 분리후 String형태로 리턴(공백제거됨)<br/>

     * (참고 : https://d2.naver.com/helloworld/76650 유니코드와 Java를 이용한 한글 처리)

     * @param text

     * @return

     */

    public static String normalizeToString(String text) {

        return Normalizer.normalize(text, Normalizer.Form.NFD);

    }

}

 

 

 

 

public class TestStringTokenChar {

 

    public static void main(String args[]) {

        System.out.println(UnicodeUtils.normalizeToString("첫번째 한글을 분리합니다"));

        

        List<Character> charList = UnicodeUtils.normalizeToChars("두번째 한글을 분리합니다");

        for (char c : charList) {

            System.out.print(c);

        }

    }

}

 

 

 

 

UnicodeUtils.java

번호 제목 글쓴이 날짜 조회 수
286 MySQL 한글깨짐현상 제거 ( UTF8 ) 황제낙엽 2019.12.08 941
285 java.util.ConcurrentModificationException 황제낙엽 2019.09.08 637
284 String, StringBuilder, StringBuffer file 황제낙엽 2019.08.03 719
283 String vs StringBuffer vs StringBuilder in Java 황제낙엽 2019.08.03 1008
282 Calendar.set() - 날짜 설정하기, Calendar.add() - 날짜 더하기, Calendar.roll() - 그 부분만 날짜 더하기 황제낙엽 2019.08.02 726
281 File 클래스 정리 황제낙엽 2019.07.29 792
280 파일 사이즈를 반환하는 유틸 함수 황제낙엽 2019.07.29 870
279 BufferedReader, BufferedWriter를 활용한 빠른 입출력 황제낙엽 2019.07.29 785
278 현재날짜, 현재시간을 원하는 형태로 출력하는(Format) 다양한 방법 file 황제낙엽 2019.07.29 684
277 자바 소수점 n번째 자리까지 반올림하기 황제낙엽 2019.07.29 777
276 java base64 encodeing,decoding 사용법 황제낙엽 2019.07.24 668
275 java.lang.StackTraceElement Class의 내용 출력 황제낙엽 2019.07.03 767
274 세션의 timeout 설정 >> HttpSession.setMaxInactiveInterval() 황제낙엽 2019.07.03 8904
273 [HttpURLConnection] 서버와의 통신 시도 시점 관련 황제낙엽 2019.06.23 861
272 역컴파일러 (decompiler, jad.exe) file 황제낙엽 2019.06.20 671
271 Microsoft SQL Server JDBC 드라이버 2.0 file 황제낙엽 2019.05.22 769
270 수치 데이터 처리 유틸리티 file 황제낙엽 2019.05.12 2101
» 한글 초성 중성 종성 분리 유틸리티(자작) file 황제낙엽 2019.05.07 828
268 한글 초성 중성 종성 분리 (자모분리) 황제낙엽 2019.05.07 767
267 한글 인코딩의 이해 1편: 한글 인코딩의 역사와 유니코드 황제낙엽 2019.05.07 783