::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2004-10-22 18:09:47, Hit : 6523, Vote : 1369
 http://www.howto.pe.kr
 한글 초성,중성,종성 음소를 입력받아 한 음절 문자로 만들기('ㄱ'+'ㅣ'+'ㅁ' => '김')

(********************************************************************************
.작성자: 김영대 ( http://www.howto.pe.kr )
.참고: http://kiscos.net/~blackangel/Windows5.html

한글의 음절이란 초성+중성+종성(받침 있는 글자) 혹은 초성+중성(받침 없는 글자)으로
구성된 한글 한 글자를 말한다.
유니코드(Unicode)란 모든 언어를 표현할 수 있는 2바이트의 코드로 유니코드의 한글은
0xAC00 부터 시작하며 한글 음절의 갯수는 (초성 19)*(중성 21)*(종성 28)=11,172 이다.

한글 음절은 아래와 같은 공식으로 유니코드가 부여된다
  음절 유니코드
     = (0xAC00) + (초성 인덱스값* 0x024C) + (중성 인덱스값* 0x001C) + (종성 인덱스값)
     = (0xAC00) + (초성 인덱스값* 21*28) + (중성 인덱스값* 28) + (종성 인덱스값)

초성 19자, 중성 21자, 종성 28자(원래 27자 이지만 종성이 없는 경우까지 해서 28자)
이므로 각각의 인덱스 값과 문자는 아래와 같다. 종성의 첫번쨰 인덱스 문자는 공백
  초성 인덱스값: 0~18 (19개) 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'
  중성 인덱스값: 0~20 (21개) 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ'
  종성 인덱스값: 0~27 (28개) ' ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ'

초성,중성,종성의 인덱스값을 계산하는 방법은 위 공식을 통하여 쉽게 만들수 있다.
  초성 인덱스값: (음절 유니코드 - 0xAC00) / (21*28)
  중성 인덱스값: (음절 유니코드 - 0xAC00) % (21*28) / 28
  종성 인덱스값: (음절 유니코드 - 0xAC00) % (21*28) % 28  {중간의 "% (21*28)"은 생략가능}

예제들면,
  '가' = (0xAC00) + (0*21*28) + (0*28) + (0) = 0xAC00
  '김' = (0xAC00) + (0*21*28) + (20*28) + (16) = 0xAE40
********************************************************************************)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  // 초성 인덱스값에 대한 문자
  UChoseong : array [0..18] of WideString =
   ('ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ',
    'ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ');

  // 중성 인덱스값에 대한 문자
  UJungseong : array [0..20] of WideString =
   ('ㅏ','ㅐ','ㅑ','ㅒ','ㅓ','ㅔ','ㅕ','ㅖ','ㅗ','ㅘ',
    'ㅙ','ㅚ','ㅛ','ㅜ','ㅝ','ㅞ','ㅟ','ㅠ','ㅡ','ㅢ',
    'ㅣ');

  // 종성 인덱스값에 대한 문자
  UJongseong : array [0..27] of WideString =
   ('','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ',
    'ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ',
    'ㅇ','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ');
      
type
  TForm1 = class(TForm)
    E_Choseong: TEdit;
    E_Jungseong: TEdit;
    E_Jongseong: TEdit;
    Button1: TButton;
    E_JoHap: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  iChoseong, iJungseong, iJongseong: WORD;
  uSyllable: PWideChar;
  sSyllable: String;
begin
  E_JoHap.Text := '';

  // 초성 문자의 인덱스 값 찾기
  for i := 0 to HIGH(UChoseong) do
    if UChoseong[i] = E_Choseong.Text then
      Break;
  if i > HIGH(UChoseong) then Exit;
  iChoseong := i;
  
  // 중성 문자의 인덱스 값 찾기
  for i := 0 to HIGH(UJungseong) do
    if UJungseong[i] = E_Jungseong.Text then
      Break;
  if i > HIGH(UJungseong) then Exit;
  iJungseong := i;

  // 종성 문자의 인덱스 값 찾기
  for i := 0 to HIGH(UJongseong) do
    if UJongseong[i] = E_Jongseong.Text then
      Break;
  if i > HIGH(UJongseong) then Exit;
  iJongseong := i;

  try
    // 유니코드 음절을 저장할 버퍼(double-byte)
    uSyllable := GlobalAllocPtr(GHND, 4);
    
    // 조합된 음절의 유니코드
    WORD(uSyllable^) := $AC00 + (iChoseong* 21*28) + (iJungseong* 28) + (iJongseong);
    E_JoHap.Text := WideString(uSyllable); // 문자로 변환

  finally
    if uSyllable <> nil then
      GlobalFreePtr(uSyllable);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  E_Choseong.Text  := 'ㄱ'; // 초성 음소
  E_Jungseong.Text := 'ㅣ'; // 중성 음소
  E_Jongseong.Text := 'ㅁ'; // 종성 음소
end;

end.





971   [윈도우즈 API] 휴지통이 비어있는지 확인하기  김영대 2004/08/05 4720 1177
970   [윈도우즈 API] 휴지통에 파일을 버리는 법  신훈재 2003/03/10 4383 1136
969   [윈도우즈 API] 휴지통 비우기  김영대 2003/03/27 5019 1246
968   [윈도우즈 API] 화면캡처하기 Delphi3.0에서...  김영대 2003/03/04 4684 1264
967   [윈도우즈 API] 화면의 Memo 가 보여줄 수 있는 라인수 알아내기  김영대 2003/03/05 4778 1184
966   [시스템] 화면보호기가 설치되어 있는지 검사하기  김영대 2003/03/07 3793 1101
965   [일반/컴포넌트] 화면변경시 콤포넌트 위치와 크기를 조정  김영대 2003/03/06 4408 1069
964   [윈도우즈 API] 화면과 taskbar의 크기와 상태는 ?  김영대 2003/03/04 4621 1308
963   [윈도우즈 API] 화면 캡쳐하여 JPEG로 저장  신훈재 2003/03/10 5018 1005
962   [시스템] 현재 프린터의 출력가능한 용지종류 구하기  김영대 2003/03/07 5955 1592
961   [윈도우즈 API] 현재 키보드 입력 언어 구하기  김영대 2004/07/24 4770 1288
960   [윈도우즈 API] 현재 실행된 모든 프로그램의 Caption 읽어오기  김영대 2003/03/07 5851 1476
959   [시스템] 현재 내 PC의 비디오 정보  김영대 2003/03/04 4392 1166
958   [COM/OLE] 현재 IE 의 HTML 소스 코드 읽어오기  김영대 2004/08/18 5597 1310
957   [시스템] 현재 CD의 Track과 시간 구하기  김영대 2003/03/06 5161 1396
956   [일반/컴포넌트] 해상도(screen resolution)를 변경했는지 검사  김영대 2003/03/07 4463 1271
955   [일반/컴포넌트] 한글이 포함된 문자열 자르기 - 반쪽 한글  김영대 2003/03/04 5853 1168
954   [시스템] 한글 한 음절을 초성,중성,종성 음소로 분해하기('김' => 'ㄱ'+'ㅣ'+'ㅁ')  김영대 2004/10/22 7789 1258
  [시스템] 한글 초성,중성,종성 음소를 입력받아 한 음절 문자로 만들기('ㄱ'+'ㅣ'+'ㅁ' => '김')  김영대 2004/10/22 6523 1369
952   [일반/컴포넌트] 한 장당 두 페이지 인쇄하기  김영대 2003/03/05 4563 1123
951   [일반/컴포넌트] 하나의 프로시저,함수로 다른 함수,프로시저를 처리  김영대 2003/03/05 3829 1117
950   [데이터베이스] 필드의 데이터 타입을 알아내기  김영대 2003/03/04 4388 1169
949   [시스템] 플로피(floppy) 디스크 드라이브의 타입 구하기  김영대 2003/03/07 5815 1526
948   [시스템] 프린트 스풀러 제어방법  김영대 2003/03/07 6140 1770
947   [네트웍/인터넷] 프린터의 용지 크기/공급 설정하기  김영대 2003/03/07 6505 1226
946   [시스템] 프린터의 대기문서,등록정보,추가 마법사 호출하기  김영대 2003/03/05 4288 1138
945   [시스템] 프린터의 "용지 공급" 리스트 구하기  김영대 2003/03/07 4605 1326
944   [시스템] 프린터에 작업중인 job의 리스트 구하기  김영대 2003/03/07 4488 1183
943   [시스템] 프린터에 escape 코드를 전달하는 방법  김영대 2003/03/06 3736 1091
942   [일반/컴포넌트] 프린터로 escape 문자 출력하기(raw print)  김영대 2003/03/07 4564 1091
941   [윈도우즈 API] 프린터 스풀러에 대기중인 job의 수  김영대 2003/03/04 4488 1329
940   [시스템] 프린터 상태가 Ready인지 아닌지 검사  김영대 2003/03/04 5710 1641
939   [시스템] 프린터 리스트를 구하여 기본 프린터 변경하기  김영대 2003/03/07 5174 1217
938   [시스템] 프로세스에 할당된 memory page 구하기  김영대 2004/08/17 4709 1249
937   [시스템] 프로세스가 원도우즈 원격 터미널에서 실행중인지 검사  김영대 2008/11/04 5356 1519
936   [시스템] 프로세스가 사용하는 모듈(DLL) 리스트 구하기  김영대 2004/09/15 5633 1232
935   [시스템] 프로세서를 생성시켜보자!  김영대 2003/03/06 4343 1151
934   [시스템] 프로그램이 동적으로 할당받은 메모리 크기 ?  김영대 2003/03/07 4247 1234
933   [일반/컴포넌트] 프로그램의 bitmap을 MS 그림판으로 편집하여 다시 불러오기  김영대 2005/03/22 5332 1366
932   [네트웍/인터넷] 프로그램으로 네트워크 드라이브 연결/해제  김영대 2003/03/07 6329 1183

1 [2][3][4][5][6][7][8][9][10]..[25] [다음 10개]
 

Copyright 1999-2019 Zeroboard / skin by zero