사용자 도구

사이트 도구


kb:koreansyllables

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:koreansyllables [2014/11/08 15:21] (현재)
줄 1: 줄 1:
 +====== Korean Syllables ======
 +한글 처리와 관련된 내용들
 +
 +
 +====== 주어진 글자가 한글인가?​ ======
 +[[http://​www.unicode.org/​charts/​PDF/​UAC00.pdf | Hangul Syllables (PDF)]] 참고
 +<code cpp>
 +/// 글자의 종류
 +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;
 +}
 +</​code>​
 +
 +====== 초중종성 분리 ======
 +[[http://​www.unicode.org/​charts/​PDF/​U3130.pdf | Hangul Compatibility Jamo (PDF)]] 참고
 +<code cpp>
 +/// \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;
 +    }
 +}
 +</​code>​
 +
 +====== 링크 ======
 +  * [[http://​trade.chonbuk.ac.kr/​~leesl/​code/​ | 코드와 한글]]
 +  * [[http://​doc.ddart.net/​hangul/​hangulcode.html | 한글 및 한국어 정보 처리 코드]]
 +  * [[http://​www.jounlai.com/​web/​prg/​kor/​index.html | 한글/ 한자와 델파이]]
 +  * [[http://​openlook.org/​trac/​wiki/​CJK | CJK]]
 +
 +
 +====== 다운로드 ======
 +  * {{koreansyllables_codeconv.zip}}
 +    * 언젠가, 어디에선가 담아뒀던 조합, 완성, 확장 완성 간의 상호 변환을 다루는 소스다.
 +    * 주석도 거의 없는 데다가, 상수가 춤을 추는 코드다. 그러므로 당연히(?​) 동작 방식에 대해서는 알지 못한다. 그냥 사용할 뿐. 
 +
 +----
 +  * see also [[Unicode]]
  
kb/koreansyllables.txt · 마지막으로 수정됨: 2014/11/08 15:21 (바깥 편집)