반응형
한글의 자모 조합
목표:
초성, 중성, 종성을 가지고 한글자로 조합합니다. 즉 'ㄱ','ㅏ','ㄹ'의 세가지 요소로 '갈'이라는 글자를 조합해 내는 함수를 만들려고 합니다.배경지식:
* 먼저 한글 자모 분해를 참조하십시오.
한가지 특이한 점은 완성형에는 없는 글자, 예를 들어 "가/ㄳ"같은 글자 역시 이 함수를 쓰면 조합이 가능하다는 것인데, 이것은 Unicode를 Multibyte 코드로 변환하는 API 함수인 WideCharToMultiByte 가 확장 완성형 문자 코드를 지원하기 때문입니다. (실제로 "가/ㄳ"은 코드값이 8142h 로서 완성형 글자 영역에 포함되지 않습니다.)
참고:
- 완성형 글자 코드의 한글 영역: xxyyh (xx: B0h ~ C8h, yy: A1h ~ FEh)
- 완성형 글자 코드의 한자 영역: xxyyh (xx: CAh ~ FDh, yy: A1h ~ FEh)
코드:
// HanComPas, HanCom // Programmed by Jounlai Cho (jounlai@yahoo.com) const ChoSungTbl: PChar = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'; JungSungTbl: PChar = 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ'; JongSungTbl: PChar = ' ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ'; UniCodeHangeulBase = $AC00; UniCodeHangeulLast = $D79F; // function HanCom: 한글 자모를 글자로 조합 // Han3: 변환할 자모, PChar 타입 // Han: 조합된 글자, PChar 타입 // (Result): 함수 호출 성공(True), 실패(False) // *주의: 변수 Han과 Han3이 가리키는 메모리 공간은 각각 2, 6바이트가 // 할당되어 있어야 한다. 그리고 Han과 Han3 모두 null-종료 문자열이 아니다. function HanCom(const Han3: PChar; Han: PChar): Boolean; var UniCode: Word; ChoSung, JungSung, JongSung: Integer; ChoSungPos, JungSungPos, JongSungPos: Integer; begin Result := False; ChoSungPos := Pos(Copy(String(Han3), 1, 2), ChoSungTbl); JungSungPos := Pos(Copy(String(Han3), 3, 2), JungSungTbl); JongSungPos := Pos(Copy(String(Han3), 5, 2), JongSungTbl); if (ChoSungPos and JungSungPos and JongSungPos) = 0 then Exit; ChoSung := (ChoSungPos - 1) div 2; JungSung := (JungSungPos - 1) div 2; JongSung := (JongSungPos - 1) div 2; UniCode := UniCodeHangeulBase + (ChoSung * 21 + JungSung) * 28 + JongSung; WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, @UniCode, 1, Han, 2, nil, nil); Result := True; end; // function HanComPas: 한글 자모를 글자로 조합 // Src: 변환할 자모, 예: 'ㄱㅏㄹ' // (Result): 조합된 글자, 예: '갈', 함수 호출 실패의 경우 ''을 반환한다. function HanComPas(const Src: String): String; var Buff: array[0..2] of Char; begin Result := ''; if Length(Src) = 6 then begin if HanCom(PChar(Src), Buff) then begin Buff[2] := #0; Result := String(Buff); end; end; end;
반응형