사용자 도구

사이트 도구


kb:koreansyllables

Korean Syllables

한글 처리와 관련된 내용들

주어진 글자가 한글인가?

Hangul Syllables (PDF) 참고

/// 글자의 종류
enum Category
{
    OTHER,                     ///< 한글 아님
    KOREAN_SYLLABLE,           ///< 한글
    KOREAN_COMPATIBILITY_JAMO, ///< 한글 자모
    KOREAN_INITIAL_PHONEME,    ///< 한글 초성 (고어 포함)
    KOREAN_MEDIAL_VOWELS,      ///< 한글 중성 (고어 포함)
    KOREAN_FINAL_CONSONANT,    ///< 한글 종성 (고어 포함)
};
 
/// \brief 주어진 글자의 종류를 반환한다.
Category GetCategory(wchar_t ch)
{
    if (0xAC00 <= ch && ch <= 0xD7A3) return KOREAN_SYLLABLE;
    if (0x3131 <= ch && ch <= 0x318E) return KOREAN_COMPATIBILITY_JAMO;
    if (0x1100 <= ch && ch <= 0x1159) return KOREAN_INITIAL_PHONEME;
    if (0x1161 <= ch && ch <= 0x11A2) return KOREAN_MEDIAL_VOWELS;
    if (0x11A8 <= ch && ch <= 0x11F9) return KOREAN_FINAL_CONSONANT;
    return OTHER;
}

초중종성 분리

Hangul Compatibility Jamo (PDF) 참고

/// \brief 주어진 글자의 초중성을 분리한다.
/// \param ch 분리할 글자
/// \param phonemes[3] 분리한 음소들을 집어넣을 배열. 종성이 없는 경우에는
/// 배열의 마지막에는 0이 들어간다.
/// \return bool 주어진 글자가 한글이었다면 true, 한글이 아니었다면 false
bool SplitPhonemes(wchar_t ch, wchar_t phonemes[3])
{
    /// 초성
    static const wchar_t INITIAL_PHONEMES[] =
    {
        L'ㄱ', L'ㄲ', L'ㄴ', L'ㄷ', L'ㄸ', L'ㄹ', L'ㅁ', L'ㅂ', L'ㅃ', L'ㅅ',
        L'ㅆ', L'ㅇ', L'ㅈ', L'ㅉ', L'ㅊ', L'ㅋ', L'ㅌ', L'ㅍ', L'ㅎ'
    };
 
    /// 중성
    static const wchar_t MEDIAL_VOWELS[] = 
    {
        L'ㅏ', L'ㅐ', L'ㅑ', L'ㅒ', L'ㅓ', L'ㅔ', L'ㅕ', L'ㅖ', L'ㅗ', L'ㅘ',
        L'ㅙ', L'ㅚ', L'ㅛ', L'ㅜ', L'ㅝ', L'ㅞ', L'ㅟ', L'ㅠ', L'ㅡ', L'ㅢ',
        L'ㅣ'
    };
 
    /// 종성
    static const wchar_t FINAL_CONSONANTS[] = 
    {
        L' ',  L'ㄱ', L'ㄲ', L'ㄳ', L'ㄴ', L'ㄵ', L'ㄶ', L'ㄷ', L'ㄹ', L'ㄺ',
        L'ㄻ', L'ㄼ', L'ㄽ', L'ㄾ', L'ㄿ', L'ㅀ', L'ㅁ', L'ㅂ', L'ㅄ', L'ㅅ',
        L'ㅆ', L'ㅇ', L'ㅈ', L'ㅊ', L'ㅋ', L'ㅌ', L'ㅍ', L'ㅎ'
    };
 
    if (GetCategory(ch) != OTHER)
    {
        ch = ch - 0xAC00;
 
        int final = ch % 28;
        int medial = ((ch - final) / 28) % 21;
        int initial = ((ch - final) / 28) / 21;
 
        phonemes[0] = INITIAL_PHONEMES[initial];
        phonemes[1] = MEDIAL_VOWELS[medial];
        phonemes[2] = final > 0 ? FINAL_CONSONANTS[final] : 0;
 
        return true;
    }
    else
    {
        return false;
    }
}

링크

다운로드

    • 언젠가, 어디에선가 담아뒀던 조합, 완성, 확장 완성 간의 상호 변환을 다루는 소스다.
    • 주석도 거의 없는 데다가, 상수가 춤을 추는 코드다. 그러므로 당연히(?) 동작 방식에 대해서는 알지 못한다. 그냥 사용할 뿐.

kb/koreansyllables.txt · 마지막으로 수정됨: 2014/11/08 15:21 (바깥 편집)