더북(TheBook)

문자열 변환

문자열은 유니코드 문자의 코드값을 정수로 표현한 값(rune 또는 int32)의 시퀀스이므로 []rune(또는 []int32)으로 변환할 수 있다. 1바이트로 표현할 수 있는 아스키 문자열은 []byte(또는 []uint8)로 변환할 수 있다. 아스키가 아닌 문자열을 []byte로 변환하면 잘못된 코드값으로 변환될 수 있으니 주의해야 한다.

표 3-11 문자열 변환

[]rune(s)

문자열 s를 유니코드 문자의 코드값 배열([]rune 또는 []int32)로 변환

[]byte(s)

문자열 s를 바이트 배열([]byte 또는 []uint)로 변환

string(chars)

유니코드 문자의 코드값 배열([]rune 또는 []int32)을 문자열로 변환

string(i)

유니코드의 코드 포인트 i를 문자열로 변환(i65라면 “A로 변환)

문자열 "hello ", "안녕하세요"와 코드값 배열 []byte, []rune 간의 변환을 시도해 보았다.

s1 := "hello"
         
fmt.Println([]rune(s1)) // [104 101 108 108 111]
fmt.Println([]byte(s1)) // [104 101 108 108 111]
 
fmt.Println(string([]byte{104, 101, 108, 108, 111})) // hello
fmt.Println(string([]rune{104, 101, 108, 108, 111})) // hello
 
s2 := "안녕하세요"
 
fmt.Println([]rune(s2)) // [50504 45397 54616 49464 50836]
fmt.Println([]byte(s2)) // [236 149 136 235 133 149 237 149 152 236 132 184 236 154 148]
 
// 안녕하세요
fmt.Println(string([]rune{50504, 45397, 54616, 49464, 50836}))
 
// 안녕하세요
fmt.Println(string([]byte{236, 149, 136, 235, 133, 149, 237, 149, 152, 236, 132, 184, 236, 154, 148}))
fmt.Println(string(104))                     // h
fmt.Println(string(236))                     // ì
fmt.Println(string(50504))                   // 안
fmt.Println(string([]byte{236, 149, 136}))   // 안

 

문자열 길이

문자열의 바이트 수를 구할 때는 len() 함수를 사용한다. 바이트가 아니라 문자열의 내부 문자 수를 구할 때는 unicode/utf8 패키지의 utf8.R uneC ountI nS tring() 함수를 사용하거나, 문자열을 []rune 타입으로 변환하고 변환한 값의 길이(len([] rune()))를 구하면 된다.


package main
 
import (
    "fmt"
    "unicode/utf8"
)
 
func main() {
    s1 := "hello"
    s2 := "안녕하세요"
 
    fmt.Println(len(s1))                      // 5
    fmt.Println(len(s2))                      // 15
    fmt.Println(utf8.RuneCountInString(s2))   // 5
    fmt.Println(len([]rune(s2)))              // 5
}

실행 결과

5

15

5

5

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.