-
[Golang] 한글을 포함한 문자열 길이 자르기언어/Golang 2016. 10. 12. 14:24
한글 단어 길이를 제한을 두어 제한치를 넘어가는 글자를 자르는 함수를 설명하겠습니다.
링크 에서 설명한 것과 같이 GO에서 len()함수는 byte기반으로 동작하기 때문에 한글은 3바이트 씩 계산됩니다.
아래와 같이 한글+숫자+영어가 섞여있는 문자열에서 글자 제한을 20자로 두어 그 이상 넘어가면 삭제하는 함수를 설명하겠습니다.
func main() {
vals := "가나다라마바사1234567890abcd"
}먼저 한글을 바이트로 변환시키면 다음과 같은 리스트를 볼 수 있습니다.
func main() {
vals := "가나다"b := []byte(vals)
fmt.Println(b)
}# [234 176 128 235 130 152 235 139 164]
하나의 숫자 당 1byte로 한글은 3바이트이기 때문에 3개씩 묶어 한 글자를 표현해 줍니다. 만일 자르고자 하는 문자열이 한글이라는 확신이 있으면 직접 함수를 만들어 사용해도 됩니다.
확신이 없다면 아래처럼 사용합니다.
import (
"fmt"
"unicode/utf8"
)func stringSplit(str string) string {
b := []byte(str)
idx := 0
for i := 0; i < 20; i++ {
_, size := utf8.DecodeRune(b[idx:])
idx += size
}
return str[:idx]
}
func main() {
vals := "가나다라마바사1234567890abcd"
var result string
result = stringSplit(vals)
fmt.Println(result)
}# 가나다라마바사1234567890abc
먼저 문자열을 바이트로 변환한 다음 utf8.DecodeRune() 라이브러리에 바이트의 첫 글자를 입력합니다. 3개의 데이터를 하나로 묶어 한글 하나를 표현하는데 utf8.DecodeRune()에 가장 맨 처음 보여지는 바이트를 입력하면 함수내에서 연관되는 바이트까지 계산을 하게 됩니다. 그리고 출력값으로 변환된 바이트의 길이와 크기??(까먹음)를 리턴합니다.
이러한 방식으로 원하는 글자수 만큼 한글+숫자+영어 문자열을 계산할 수 있습니다.