잠시만 기다려 주세요

     '싸우지 않는 이재명을 규탄한다. 민생충, 협치충, 역풍충.. 국민들은 치가 떨린다.'
전체검색 :  
이번주 로또 및 연금번호 발생!!   |  HOME   |  여기는?   |  바다물때표   |  알림 (16)  |  여러가지 팁 (1056)  |  추천 및 재미 (152)  |  자료실 (22)  |  
시사, 이슈, 칼럼, 평론, 비평 (602)  |  끄적거림 (129)  |  문예 창작 (705)  |  바람 따라 (69)  |  시나리오 (760)  |  드라마 대본 (248)  |  
살인!


    golang

golang - golang 유니코드 한글 초성, 중성, 종성의 합성, 자모 분석, 한글 자음, 모음 분리하기, 합치기
이 름 : 바다아이   |   조회수 : 9391         짧은 주소 : 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
번 호 카테고리 제 목 이름 조회수
179 golang golang , ... 바다아이 1725
178 golang golang , map . 바다아이 1326
177 golang Golang (, , data ) , ... 바다아이 1337
176 golang golang sort ... 바다아이 1569
175 golang golang html.EscapeString html.UnescapeString input value ... 바다아이 1695
174 golang golang go.mod go.sum . GOPATH SRC not module, 1.16 . 바다아이 4969
173 golang go 1.16 ... is not in GOROOT.. GOPATH .... . 바다아이 5867
172 golang , String Formatting 바다아이 7504
171 golang rand.Intn , random, , . 바다아이 6967
170 golang golang ... 바다아이 10058
169 golang golang gopath, goroot .. golang 바다아이 7636
168 golang golang ... Force download file example 바다아이 9428
167 golang golang , , cpu, memory, disk 바다아이 10723
166 golang golang , ... GOOS, GOARCH 바다아이 8497
165 golang golang checkbox ... 바다아이 8249
164 golang golang , , http .... 바다아이 8022
163 golang golang nil , nil , nil ... 바다아이 8369
162 golang 2 golang, go , .... golang .... 바다아이 11237
161 golang golang postgresql, mysql, mariadb ... ` Grave () .. .. 바다아이 8561
160 golang golang postgresql mysql, mariadb scan , null .. 바다아이 8703
159 golang golang , iconv 바다아이 11493
158 golang golang quote escape, unquote 바다아이 8899
157 golang golang , http errorLog , , ... 바다아이 9002
156 golang golang interface , 바다아이 8476
155 golang golang struct .... 바다아이 9146
154 golang golang map map , 바다아이 8672
153 golang golang map .... .... 바다아이 8191
152 golang golang slice copy 바다아이 8288
151 golang golang goto 바다아이 9149
150 golang golang slice sort , int, string, float64 바다아이 8628
| |









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