본문 바로가기
Application/Delphi Lecture

한글의 자모 조합

by 현이빈이 2008. 7. 24.
반응형

한글의 자모 조합

목표:

초성, 중성, 종성을 가지고 한글자로 조합합니다. 즉 'ㄱ','ㅏ','ㄹ'의 세가지 요소로 '갈'이라는 글자를 조합해 내는 함수를 만들려고 합니다.

배경지식:

* 먼저 한글 자모 분해를 참조하십시오.

한가지 특이한 점은 완성형에는 없는 글자, 예를 들어 "가/ㄳ"같은 글자 역시 이 함수를 쓰면 조합이 가능하다는 것인데, 이것은 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;
반응형