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

번호 제목 글쓴이 날짜 조회 수
22 문자의 ASCII 값 테이블 - String.charAt() file 황제낙엽 2023.03.28 0
21 숫자형 클래스 BigInterger (int, long 범위 초과) 황제낙엽 2022.01.16 368
20 LocalDate.now() 오늘 날짜 황제낙엽 2022.01.16 7
19 지정한 일자보다 하루 뒤로 설정하기 황제낙엽 2021.01.14 15
18 Calendar.set() - 날짜 설정하기, Calendar.add() - 날짜 더하기, Calendar.roll() - 그 부분만 날짜 더하기 황제낙엽 2019.08.02 89
17 현재날짜, 현재시간을 원하는 형태로 출력하는(Format) 다양한 방법 file 황제낙엽 2019.07.29 66
16 자바 소수점 n번째 자리까지 반올림하기 황제낙엽 2019.07.29 163
» 한글 초성 중성 종성 분리 유틸리티(자작) file 황제낙엽 2019.05.07 244
14 한글 초성 중성 종성 분리 (자모분리) 황제낙엽 2019.05.07 100
13 한글 인코딩의 이해 1편: 한글 인코딩의 역사와 유니코드 황제낙엽 2019.05.07 198
12 한글 인코딩의 이해 2편: 유니코드와 Java를 이용한 한글 처리 file 황제낙엽 2019.05.07 231
11 현재 월,일,시간,분,초 등등 가져오기 황제낙엽 2017.11.02 858
10 Calendar, Date, Format, java.time 패키지 황제낙엽 2017.10.31 108
9 날짜, 시간 문자열 값으로 Date 오브젝트로 만들기 >> SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US) 황제낙엽 2017.10.31 1516
8 SimpleDateFormat Symbol file 황제낙엽 2016.12.20 74
7 숫자의 형식화 #1(Part-1)-java.text.NumberFormat 황제낙엽 2008.07.08 19
6 숫자 에 대응 되는 문자의 형식화 #2 황제낙엽 2008.07.08 33
5 숫자 에 대응 되는 패턴의 형식화 #1 황제낙엽 2008.07.08 51
4 숫자를 통화 표기 형태로 변환하기 황제낙엽 2008.07.08 27
3 NumberFormat, DecimalFormat 사용예 황제낙엽 2008.07.08 94