유니코드의 한글은 &hAC00부터 시작하며 초성은 19자, 중성은 21자, 종성은 28자로 이루어저있으면 종성의 첫자는 종성이 없음을 나타냅니다.
그러면 유니코드는 어떤식으로 어떤식으로 생성이되냐면 초성,중성,종성을 각 구성된 자리 수 만큼 곱한 값을 더한 값이니다. 여기에 유니코드 한글 시작값 &hAC00을 더한 값이 유니코드가 됩니다.
이런 형태입니다. 우리가 10시 20분 17초를 초로 환산하면 (10*60 * 60) + (20 * 60) + 17 계산을 하면 37217초라는 값이 나옵니다.
이와 같은 형태로 초성에는 21*28을 곱한 값을 중성에는 28을 곱한 값을 나머지 종성 값을 더한후에 &HAC00을 더하게 되면 유니코드 값이됩니다. 반대로 유니코드를 초성,중성,종성으로 분리 하기 위해서는 먼저 &HAC00를 뺀 갑에서 21*28로 나누눈 값이 초성이 될거이고 나머지 값에서 28로 나눈 값이 중성이고, 그 나머지 값이 종성이 됩니다.

다음은 소스의 초기 화면입니다


다음은 텍스트 박스에 한글을 입력하고 초성,중성,종성을 분리한 이미지 입니다.

만약 텍스트 박스에 완성되지 않은 한글이나, 한글이 아닌 문자를 입력한 경우는 메세지 박스가 표시됩니다.


소스입니다.
' 유니코드 한글 문자 초중종성 분리하기
Option Explicit

Private FirstChar(18) As String ' 초성 테이블 19자
Private MiddleChar(20) As String ' 중성 테이블 21자
Private EndChar(27) As String ' 종성 테이블 28자

Private Sub Form_Load()
    CreateCopyTable Array("ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"), FirstChar
    CreateCopyTable Array("ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ"), MiddleChar
    CreateCopyTable Array(vbNullString, "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"), EndChar
End Sub

Private Sub txtInputChar_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim FirstCharCode As Long
    Dim MiddleCharCode As Long
    Dim EndCharCode As Long

    If Not KeyCode = vbKeyReturn Then Exit Sub
    If Not Len(txtInputChar) = 1 Then Exit Sub
    If SplitHangul(AscW(Left(txtInputChar.Text, 1)), FirstCharCode, MiddleCharCode, EndCharCode) Then
        labFirstChar.Caption = FirstChar(FirstCharCode)
        labMiddleChar.Caption = MiddleChar(MiddleCharCode)
        labLastChar.Caption = EndChar(EndCharCode)
    Else
        MsgBox "한글 문자가 아닙니다"
    End If
End Sub

Private Sub CreateCopyTable(Sou As Variant, Des() As String) ' Variant 테이블을 스트링 테이블에 복사
    Dim ForCount As Long
    Dim EndCount As Long
   
    EndCount = UBound(Sou)
    For ForCount = 0 To EndCount
        Des(ForCount) = Sou(ForCount)
    Next ForCount
End Sub


Private Function SplitHangul(InCode As Integer, first As Long, middle As Long, last As Long) As Boolean ' 한글의 초중종성 분리
    Dim Code As Long

    SplitHangul = False
    Code = InCode
    Select Case Sgn(InCode)
        Case -1 ' 음수
            If InCode < &HAC00 Then Exit Function
        Case 1, 0 '양수
            Exit Function
    End Select
    Code = Code - &HAC00
    first = Int(Code / (21 * 28))  ' 초성을 분리합니다.
    Code = Code Mod (21 * 28) ' 전체 코드에서 초성을 떼어내고 중성과 종성을 남깁니다.
    middle = Int(Code / 28) '중성을 분리합니다.
    last = Code Mod 28 ' 중성을 떼어내고 종성을 남깁니다.
    SplitHangul = True
End Function

다음 링크는 윈도우에서 한글을 사용하게 되는 경우 코드 페이지 949의 코드 문자표 링크입니다.
http://msdn.microsoft.com/en-us/goglobal/cc305154

+ Recent posts