잠시만 기다려 주세요

HOME   |  여기는?   |  바다물때표   |  여러가지 팁 (888)  |  추천 및 재미 (154)  |  자료실 (20)  |  끄적거림 (520)  |  시나리오 (760)  |  드라마 대본 (248)  |  

2020년 09월 27일
생각은 몸이 만들지만... 마음의 평화는 하늘에서 만든다. - 바다아이
 




    golang

golang - golang 유니코드 한글 초성, 중성, 종성의 합성, 자모 분석, 한글 자음, 모음 분리하기, 합치기
이 름 : 바다아이   |   조회수 : 2797         짧은 주소 : https://www.bada-ie.com/su/?971591803728
구글님을 통해서 한글 초성검색 또는 초성, 중성, 종성 이런식으로 검색 하시면 엄청난 자료들이 나옵니다.
지금은 어느 검색 포털이나 쇼핑몰 검색에서 흔히 사용되는 기술이죠.
오픈 된 소스가 많이 있기 때문에 잘 작성된 코드 보고 원리를 이해하고 자신의 서비스에 맞게 적용하시면 
될 것 같습니다.

저는 늘 그렇듯이 맨날 잊어버려서 복습 차원에서 또 블로깅을 해봅니다. :)

보통 시작하기에 앞서 한글의 초성, 중성, 종성을 먼저 정리 하게 됩니다.
하고 싶은게 초중종을 분리 하는 것이기 때문에 당연한 것이라고 생각 됩니다.
저 같은 경우는 내가 하고 싶은걸 먼저 적고 그걸 어떻게 구현 할 수 있을까 를 고민 하면서 스케치를 합니다.
그런 다음 고민한 내용을 기반으로 직접 구현 할 것인지 오픈소스를 가져다 사용할 것인지를 또 정리 합니다.

이미 잘 작성된 오픈 소스가 있다면 당연히 비용을 줄이는 차원에서 가져다 사용을 합니다.
단, 사용하는 오픈 소스나 도구의 동작 원리와 내부 구성이 어떻게 되어 있는지는 잘 분석하고 시작을 해야 
한다고 생각 합니다.
그래야 시행착오를 줄일 수 있지 않을까 생각 하거든요.

암튼 이제 살펴 보겠습니다.

[초성/자음] - 19자
{'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ',
 'ㅍ', 'ㅎ'}

[중성/모음] - 21자

{'ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ',
 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ'}

[종성/받침] - 28자 (채움문자 포함)

{' ', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ',
 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'}

[초성 유니코드]

{0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146, 0x3147, 
0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e}

[중성 유니코드]

{0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a,
 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163}

[종성 유니코드]

{0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 0x313a, 0x313b, 0x313c, 
0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x314a, 
0x314b, 0x314c, 0x314d, 0x314e}


아래는 국립국어연구원에서 발췌한 글 입니다.

[한글의 자모로 조합 가능한 글자의 수는 11,172개]

우리가 조합형 한글 코드로 조합하여 만들 수 있는 글자의 수는 얼마나 될까? 초성과 중성에 쓰이는 
자음과 모음의 숫자는 한글 맞춤법 규정과 다를 것이 없다. 그러나 받침의 경우는 사정이 조금 다르다. 
우리말은 받침이 없는 경우가 있기 때문에 받침이 없는 경우에도 한글 한 글자에 해당하는 2바이트(16비트)를 
만들기 위한 5비트의 종성을 채워줄 수 있는 채움 문자가 필요하다. 그래서 조합할 수 있는 받침의 수는 
한글 맞춤법에 나온 27자에 채움 문자 한 글자가 더 들어간 28자로 계산하여야 한다. 따라서 조합형 한글 코드로 
만들어 낼 수 있는 글자의 수는 19(초성)×21(중성)×28(종성)=11,172개이다. 물론 이는 이론적으로 가능한 
숫자이고 조합 가능한 모든 글자가 실생활에서 쓰이는 것은 아니다.
여기서 이렇게 한글만 정리 하면 영어 같은 경우는 어떻게 할 수 있을까요?
영어는 그냥 글자 자체로 초성으로 취급 하면 되지 않겠습니까?
이렇게 한글에 대한 분리와 분리된 자모를 다시 합치기 위한 공식이 나오게 됩니다.
당연히 누군가 만들어 놓은 공식을 사용하였습니다.
단, 왜 이렇게 나왔는지를 이해하고 사용하시면 좋겠습니다.

[분리 기본 공식]

    초성 = ( ( (글자 - 0xAC00) - (글자 - 0xAC00) % 28 ) ) / 28 ) / 21
    중성 = ( ( (글자 - 0xAC00) - (글자 - 0xAC00) % 28 ) ) / 28 ) % 21
    종성 = (글자 - 0xAC00) % 28

[합치기 기본 공식]

    원문 = 0xAC00 + 28 * 21 * (초성의 index) + 28 * (중성의 index) + (종성의 index)

    각 index 정보는 CHOSUNG, JUNGSUNG, JONGSUNG char[]에 정의한 index 입니다.
    하지만 아래 코드에서는 원문이 필요 없기 때문에 합치기 위한 로직은 포함 되어 있지 않습니다

자 그럼 초성, 중성, 종성 알아봤고, 공식까지 확인했으니 구현만 하면 되겠습니다.


출처: http://jjeong.tistory.com/1067 

자 이제 부터는 golang 으로 위의 것을 바탕으로 만들어 보도록 하겠습니다.
귀찮니즘 발동으로 막 날려서 만들었으니 각자 다듬어서 잘 사용하시기 바랍니다. ^^;
줄이 길어 엔터 좀 쳤습니다. 소스 붙여넣으실 때 그 부분 잘 다듬으세요... 


package main

import (
	"fmt"
	"strconv"
	"strings"
)

var (
	one   = []string{"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", 
"ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}
	two   = []string{"ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", 
"ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ"}
	three = []string{"", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", 
"ㄾ", "ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}

/*
	[초성 유니코드]
	{0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146,
 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e}

	[중성 유니코드]
	{0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159,
 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163}

	[종성 유니코드]
	{0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 0x313a, 0x313b,
 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148,
 0x314a, 0x314b, 0x314c, 0x314d, 0x314e}
*/
)

func cjj(word string) string {
	var sum string

	a := []rune(word)

	for i := 0; i < len(a); i++ {

		s := fmt.Sprintf("0x%x", a[i])
		s2, _ := strconv.ParseInt(s, 0, 64)

		if s2 > 44032 && s2 < 55203 {

			cho := (((s2 - 0xAC00) - (s2-0xAC00)%28) / 28) / 21
			jung := (((s2 - 0xAC00) - (s2-0xAC00)%28) / 28) % 21
			jong := (s2 - 0xAC00) % 28

			sum += one[cho] + two[jung] + three[jong]
		} else {
			sum += string(a[i]) + " "
		}

	}

	return sum
}

func cjjSum(word []string) string {

	sum2 := [3]int{}

	if len(word) == 2 {
		word = append(word, "")
	} else if len(word) < 2 {
		fmt.Println("최소 두개는 넣으쇼.")
		return ""
	} else if len(word) > 3 {
		fmt.Println("뭐 이르케 많이 넣었나.")
		return ""
	}

	for i := 0; i < len(word); i++ {

		word[i] = strings.Trim(word[i], " ")

		if i == 0 {
			for key, value := range one {
				if value == word[i] {
					sum2[0] = key
				}
			}
		} else if i == 1 {
			for key, value := range two {
				if value == word[i] {
					sum2[1] = key
				}
			}
		} else if i == 2 {
			for key, value := range three {
				if value == word[i] {
					sum2[2] = key
				}
			}
		}
	}

	gogo := 0xAC00 + 28*21*sum2[0] + 28*sum2[1] + sum2[2]

	gogo2 := fmt.Sprintf("%q", gogo)
	gogo2 = strings.Trim(gogo2, "'")

	return gogo2
}

func main() {
	kk := cjj("찐따")
	fmt.Println(kk)

	fmt.Println("\n")

	oh := []string{"ㄱ", "ㅜ", "ㄱ"}
	kk2 := cjjSum(oh)
	fmt.Println(kk2)
}
| |


      1 page / 6 page
번 호 카테고리 제 목 이름 조회수
173 golang , String Formatting 바다아이 259
172 golang rand.Intn , random, , . 바다아이 266
171 golang golang ... 바다아이 1430
170 golang golang gopath, goroot .. 바다아이 1097
169 golang golang ... Force download file example 바다아이 1583
168 golang golang , , cpu, memory, disk 바다아이 2303
167 golang golang , ... GOOS, GOARCH 바다아이 1627
166 golang golang checkbox ... 바다아이 1858
165 golang golang , , http .... 바다아이 1796
164 golang golang nil , nil , nil ... 바다아이 1894
163 golang 2 golang, go , .... golang .... 바다아이 2695
162 golang golang postgresql, mysql, mariadb ... ` Grave () .. .. 바다아이 1975
161 golang golang postgresql mysql, mariadb scan , null .. 바다아이 2061
160 golang golang , iconv 바다아이 2211
159 golang golang quote escape, unquote 바다아이 2129
158 golang golang , http errorLog , , ... 바다아이 2232
157 golang golang interface , 바다아이 2165
156 golang golang struct .... 바다아이 2289
155 golang golang map map , 바다아이 2152
154 golang golang map .... .... 바다아이 2121
153 golang golang slice copy 바다아이 2078
152 golang golang goto 바다아이 2158
151 golang golang slice sort , int, string, float64 바다아이 2226
150 golang URL Parsing, url . parse 바다아이 2297
149 golang golang , interface{} ... 바다아이 2214
148 golang golang interface to string, , , map slice json 바다아이 2063
147 golang golang How to convert JSON string to map and slice, json 바다아이 2216
146 golang golang , file write, Writing Files 바다아이 2341
145 golang golang Insert Line or String to File, , , , , 바다아이 2094
144 golang golang replace 바다아이 2175
| |








Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ FreeBSD + GoLang + PostgreSQL ]
서버위치 : vultr.com 서울  실행시간 : 0.44331
to webmaster... gogo sea. gogo sea.