golang 基礎(19)字串

square-gopher.png
字元和字串處理
func main(){ s := "Yes我愛Go!" fmt.Printf("%s\n",[]byte(s)) }
這樣打印出是就是 "Yes我愛Go!"、列印一下( fmt.Println(len(s))
)輸出 s 長度為 12 。那麼這個 12 是怎麼來的呢。
fmt.Printf("%X\n",[]byte(s))
可以打印出裡面具體位元組的數字,會使用 %X 來列印位元組
596573E68891E788B1476F21
這樣並不便於觀察,我們可以通過 for 迴圈來講字元一個一個打印出來
for _, b := range []byte(s){ fmt.Printf("%X ",b) } fmt.Println()
596573E68891E788B1476F21
這個是 ASC碼,( E6 88 91)每個中文佔三個位元組,這個就是 utf-8 編碼,是一個可變長的編碼形式,那麼每一個英文字母佔一個位元組。
上面我們是看字串的位元組是怎麼放置的
我們換一種方式進行遍歷列印,打印出沒個字元的 unicode
for i, ch := range s{ fmt.Printf("(%d %X) ", i,ch) }
從索引 3 開始值是 6211 ch 是一個 int32 型別,也就是 rune,rune 就是 int32 的別名 UTF-8 轉 unicode,E6 88 91 是 uft-8 的編碼轉成了 unicode 編碼 6211,下一字是從 6 開始轉為 unicode 7231。這樣打印出來索引並不連續。
(0 59) (1 65) (2 73) (3 6211) (6 7231) (9 47) (10 6F) (11 21)
可以使用 go 語言 utf8 標準庫提供的 RuneCountInString 來進行列印。
fmt.Println("Rune count: ", utf8.RuneCountInString(s))
使用 RuneCountInString 這回輸出為 9 對了
Rune count:9
這樣我們就可以通過遍歷一個一個打印出來字元
bytes := []byte(s) //拿到位元組 for len(bytes) > 0 { ch, size := utf8.DecodeRune(bytes) //字元 中文字元size 3 bytes = bytes[size:] fmt.Printf("%c ", ch) }
package main import ( "fmt" "unicode/utf8" ) func main(){ s := "Yes我愛Go!" fmt.Println(len(s)) // 12 fmt.Println(s) fmt.Printf("%X\n",[]byte(s))//596573E68891E788B1476F21 for _, b := range []byte(s){ fmt.Printf("%X\t",b) } //596573E68891E788B1476F21 //每個中文是 3 位元組 3 * 2 + 6 = 12 位元組 fmt.Println() for i, ch := range s{ fmt.Printf("(%d %X) ", i,ch) } //(0 59) (1 65) (2 73) (3 6211) (6 7231) (9 47) (10 6F) (11 21) // 3 6211 ch 本身是 int 32 那就是 rune unicode 編碼 //(6) utf-8 進行解碼為 unicode fmt.Println() fmt.Println("Rune count: ", utf8.RuneCountInString(s)) //9 這個對了 bytes := []byte(s) //拿到位元組 for len(bytes) > 0 { ch, size := utf8.DecodeRune(bytes) //字元 中文字元size 3 bytes = bytes[size:] fmt.Printf("%c ", ch) } //我們 fmt.Println() for i,ch := range []rune(s) { fmt.Printf("(%d %c)",i,ch) //(0 Y)(1 e)(2 s)(3 我)(4 愛)(5 G)(6 o)(7 !) } //轉為 rune 陣列或 slice //range 遍歷 pos rune 對 pos 是不連續 // utf8 RuneCountInString 獲取字元數 // 使用len獲得位元組長度 // 使用 byte 獲取位元組 }

highres_442654178.jpeg