ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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()에 가장 맨 처음 보여지는 바이트를 입력하면 함수내에서 연관되는 바이트까지 계산을 하게 됩니다. 그리고 출력값으로 변환된 바이트의 길이와 크기??(까먹음)를 리턴합니다.

    이러한 방식으로 원하는 글자수 만큼 한글+숫자+영어 문자열을 계산할 수 있습니다.



    댓글