본문 바로가기

자료

[C#/VB.NET] 한글을 자음 모음으로 나누기 & 합치기

728x90

[C#/VB.NET] 한글을 자음 모음으로 나누기 + 합치기


 

Function fnName(inName As StringAs String

    Dim 초성 As Variant, 중성 As Variant, 종성 As Variant

    Dim vr() As Variant

    Dim i As Integer, j As Integer, n As Long, k1 As Integer, k2 As Integer, k3 As Integer

    초성 = Array("ㄱ""ㄲ""ㄴ""ㄷ""ㄸ""ㄹ""ㅁ""ㅂ""ㅃ""ㅅ""ㅆ""ㅇ""ㅈ""ㅉ""ㅊ""ㅋ""ㅌ""ㅍ""ㅎ")

    중성 = Array("ㅏ""ㅐ""ㅑ""ㅒ""ㅓ""ㅔ""ㅕ""ㅖ""ㅗ""ㅘ""ㅙ""ㅚ""ㅛ""ㅜ""ㅝ""ㅞ""ㅟ""ㅠ""ㅡ""ㅢ""ㅣ")

    종성 = Array("""ㄱ""ㄲ""ㄳ""ㄴ""ㄵ""ㄶ""ㄷ""ㄹ""ㄺ""ㄻ""ㄼ""ㄽ""ㄾ""ㄿ""ㅀ""ㅁ""ㅂ""ㅄ""ㅅ""ㅆ""ㅇ""ㅈ""ㅊ""ㅋ""ㅌ""ㅍ""ㅎ")

    For i = 1 To Len(inName)

        If Mid(inName, i, 1) Like "[가-힇]" Then

            n = AscW(Mid(inName, i, 1)) + 21504

            k1 = Int(n / (21 * 28))

            k2 = Int((n Mod 21 * 28/ 28)

            k3 = n Mod 28

            j = j + 1

            ReDim Preserve vr(1 To j)

            vr(j) = 초성(k1) & 중성(k2) & 종성(k3)

        End If

    Next i

    '분리된 자,모음에 들어간 띄어쓰기 없애며 Join

    fnName = Replace(Join(vr), " """)

End Function

실제 타이핑에 사용하도록 수정

 

Function fnName(inName As StringAs String

    Dim 초성 As Variant, 중성 As Variant, 종성 As Variant

    Dim vr() As Variant

    Dim i As Integer, j As Integer, n As Long, k1 As Integer, k2 As Integer, k3 As Integer

    초성 = Array("ㄱ""ㄲ""ㄴ""ㄷ""ㄸ""ㄹ""ㅁ""ㅂ""ㅃ""ㅅ""ㅆ""ㅇ""ㅈ""ㅉ""ㅊ""ㅋ""ㅌ""ㅍ""ㅎ")

    중성 = Array("ㅏ""ㅐ""ㅑ""ㅒ""ㅓ""ㅔ""ㅕ""ㅖ""ㅗ""ㅗㅏ""ㅗㅐ""ㅗㅣ""ㅛ""ㅜ""ㅜㅓ""ㅜㅔ""ㅜㅣ""ㅠ""ㅡ""ㅡㅣ""ㅣ")

    종성 = Array("""ㄱ""ㄲ""ㄱㅅ""ㄴ""ㄴㅈ""ㄴㅎ""ㄷ""ㄹ""ㄹㄱ""ㄹㅁ""ㄹㅂ""ㄹㅅ""ㄹㅌ""ㄹㅍ""ㄹㅎ""ㅁ""ㅂ""ㅂㅅ""ㅅ""ㅆ""ㅇ""ㅈ""ㅊ""ㅋ""ㅌ""ㅍ""ㅎ")

    For i = 1 To Len(inName)

        If Mid(inName, i, 1) Like "[가-힇]" Then

            n = AscW(Mid(inName, i, 1)) + 21504

            k1 = Int(n / (21 * 28))

            k2 = Int((n Mod 21 * 28/ 28)

            k3 = n Mod 28

            j = j + 1

            ReDim Preserve vr(1 To j)

            vr(j) = 초성(k1) & 중성(k2) & 종성(k3)

        End If

    Next i

    '분리된 자,모음에 들어간 띄어쓰기 없애며 Join

    fnName = Replace(Join(vr), " """)

End Function

사용중

 

Function Jamo(T As String)

    Dim ChoSung As Variant, JOONGSUNG As Variant, JongSung As Variant

    Dim i As Integer, K As Long

    Dim T1 As String, T2 As String, T3 As String

    ChoSung = Array("ㄱ""ㄲ""ㄴ""ㄷ""ㄸ""ㄹ""ㅁ""ㅂ""ㅃ""ㅅ""ㅆ""ㅇ""ㅈ""ㅉ""ㅊ""ㅋ""ㅌ""ㅍ""ㅎ")

    JOONGSUNG = Array("ㅏ""ㅐ""ㅑ""ㅒ""ㅓ""ㅔ""ㅕ""ㅖ""ㅗ""ㅗㅏ""ㅗㅐ""ㅗㅣ""ㅛ""ㅜ""ㅜㅓ""ㅜㅔ""ㅜㅣ""ㅠ""ㅡ""ㅡㅣ""ㅣ")

    JongSung = Array(Empty, "ㄱ""ㄲ""ㄱㅅ""ㄴ""ㄴㅈ""ㄴㅎ""ㄷ""ㄹ""ㄹㄱ""ㄹㅁ""ㄹㅂ""ㄹㅅ""ㄹㅌ""ㄹㅍ""ㄹㅎ""ㅁ""ㅂ""ㅂㅅ""ㅅ""ㅆ""ㅇ""ㅈ""ㅊ""ㅋ""ㅌ""ㅍ""ㅎ")

    For i = 1 To Len(T)

        If Mid(T, i, 1) Like "[가-힣]" Then

            K = AscW(Mid(T, i, 1))

            K = K - &HAC00

            T1 = Int(K / (21 * 28))

            T2 = Int((K Mod 21 * 28/ 28)

            T3 = K Mod 28

            Jamo = Jamo & ChoSung(T1) & JOONGSUNG(T2) & JongSung(T3)

        Else

            Jamo = Jamo + Mid(T, i, 1)

        End If

    Next

End Function

 

영타로 바로출력 << 사용중...

 

Function SplitEnglish(T As String)

    Dim ChoSung As Variant, JoongSung As Variant, JongSung As Variant

    Dim vR()

    Dim i As Integer, j As Integer, n As Long, k1 As Integer, k2 As Integer, k3 As Integer

    ChoSung = Array("r""R""s""e""E""f""a""q""Q""t""T""o""w""W""c""z""x""v""g")

    JoongSung = Array("k""o""i""il""j""p""u""ul""h""hk""ho""hl""y""n""nj""np""nl""b""m""ml""l")

    JongSung = Array("""r""R""rt""s""sw""sg""e""f""fr""fa""fq""ft""fx""fv""fg""a""q""qt""t""T""d""w""c""z""x""v""g")

    For i = 1 To Len(T)

        If Mid(T, i, 1) Like "[가-힣]" Then

            K = AscW(Mid(T, i, 1))

            K = K - &HAC00

            T1 = Int(K / (21 * 28))

            T2 = Int((K Mod 21 * 28/ 28)

            T3 = K Mod 28

            SplitEnglish = SplitEnglish & ChoSung(T1) & JoongSung(T2) & JongSung(T3)

        Else

            SplitEnglish = SplitEnglish + Mid(T, i, 1)

        End If

    Next

End Function

 

'// 초성, 중성, 종성 Join
Function PlusKorean(inName As StringAs String

    Dim 초성, 중성, 종성

    Dim vr() As String

    Dim worD As String

    Dim i%, j%

    Dim k1%, k2%, k3%

    Dim wkF As WorksheetFunction

    Set wkF = WorksheetFunction

    초성 = Array("ㄱ""ㄲ""ㄴ""ㄷ""ㄸ""ㄹ""ㅁ""ㅂ""ㅃ""ㅅ""ㅆ""ㅇ""ㅈ""ㅉ""ㅊ""ㅋ""ㅌ""ㅍ""ㅎ")

    중성 = Array("ㅏ""ㅐ""ㅑ""ㅒ""ㅓ""ㅔ""ㅕ""ㅖ""ㅗ""ㅘ""ㅙ""ㅚ""ㅛ""ㅜ""ㅝ""ㅞ""ㅟ""ㅠ""ㅡ""ㅢ""ㅣ")

    종성 = Array("""ㄱ""ㄲ""ㄳ""ㄴ""ㄵ""ㄶ""ㄷ""ㄹ""ㄺ""ㄻ""ㄼ""ㄽ""ㄾ""ㄿ""ㅀ""ㅁ""ㅂ""ㅄ""ㅅ""ㅆ""ㅇ""ㅈ""ㅊ""ㅋ""ㅌ""ㅍ""ㅎ")

    For i = 1 To Len(inName)

        worD = Mid(inName, i, 1)

        '초성, 종성 구분(뒤에 오는 자,모의 종류에 따라서 구분)

        If worD Like "[ㄱ-ㅎ]" Then

            '자음 다음에 모음이 오면 초성

            If Mid(inName, i + 11) Like "[ㅏ-ㅣ]" Then

                k1 = wkF.Match(worD, 초성) - 1

            '자음 다음에 자음이 오거나 글자 길이와 같으면 종성

            ElseIf Mid(inName, i + 11) Like "[ㄱ-ㅎ]" Or i = Len(inName) Then

                k3 = wkF.Match(worD, 종성) - 1

                '종성이 끝나면 배열에 값 삽입

                ReDim Preserve vr(j)

                vr(j) = ChrW(-21504 + (28 * 21 * k1) + (28 * k2) + k3)

                j = j + 1

            End If

        '모음은 중성

        ElseIf worD Like "[ㅏ-ㅣ]" Then

            k2 = wkF.Match(worD, 중성) - 1

            '모음의 두칸 뒤가 또 모음이거나 글자의 마지막이면 종성이 없는 것으로 보고 배열에 값 삽입

            If Mid(inName, i + 21) Like "[ㅏ-ㅣ]" Or i = Len(inName) Then

                k3 = 0  '모음으로 끝나는 글자이므로 종성 초기화

                ReDim Preserve vr(j)

                vr(j) = ChrW(-21504 + (28 * 21 * k1) + (28 * k2) + k3)

                j = j + 1

            End If

        End If

    Next i

    PlusKorean = Replace(Join(vr), " """)

End Function

 

 

 

 

자음,모음 합치기 << 사용중

 

Private Const HAN_FIRST As Double = 44032#

Public Function HanJoin(ByVal Cho As StringByVal Jung As String, Optional ByVal Jong As String = ""As String

    Dim ChoSeong  As Integer

    Dim JungSeong As Integer

    Dim JongSeong As Integer

    Dim i As Integer

    Dim Ch As Variant, Ju As Variant, Jo As Variant

    Ch = Array("ㄱ""ㄲ""ㄴ""ㄷ""ㄸ""ㄹ""ㅁ""ㅂ""ㅃ""ㅅ""ㅆ""ㅇ""ㅈ""ㅉ""ㅊ""ㅋ""ㅌ""ㅍ""ㅎ")

    Ju = Array("ㅏ""ㅐ""ㅑ""ㅐ""ㅓ""ㅔ""ㅕ""ㅖ""ㅗ""ㅘ""ㅙ""ㅚ""ㅛ""ㅜ""ㅟ""ㅞ""ㅟ""ㅠ""ㅡ""ㅢ""ㅣ")

    Jo = Array("""ㄱ""ㄲ""ㄳ""ㄴ""ㄵ""ㄶ""ㄷ""ㄹ""ㄺ""ㄻ""ㄼ""ㄽ""ㄾ""ㄿ""ㅀ""ㅁ""ㅂ""ㅄ""ㅅ""ㅆ""ㅇ""ㅈ""ㅊ""ㅋ""ㅌ""ㅍ""ㅎ")

    ChoSeong = -1

    For i = 0 To 18

        If Cho = Ch(i) Then ChoSeong = i: Exit For

    Next i

    If ChoSeong < 0 Then Exit Function

    JungSeong = -1

    For i = 0 To 20

        If Jung = Ju(i) Then JungSeong = i: Exit For

    Next i

    If JungSeong < 0 Then Exit Function

    JongSeong = -1

    For i = 0 To 27

        If Jong = Jo(i) Then JongSeong = i: Exit For

    Next i

    If JongSeong < 0 Then Exit Function

    HanJoin = ChrW((ChoSeong * 21 + JungSeong) * 28 + JongSeong + HAN_FIRST)

End Function

728x90