2 回答

TA貢獻1752條經驗 獲得超4個贊
Go 字符串在概念上是只讀字節數組的只讀切片。未指定該字節數組的編碼,但字符串常量將是 UTF-8 并且在其他字符串中使用 UTF-8 是推薦的方法。
Go 提供了方便的函數來訪問 UTF-8 作為 unicode 代碼點(或 go-speak 中的符文)。字符串上的范圍循環將為您進行 utf8 解碼。轉換為 []rune 將為您提供 rune 切片,即按順序排列的 unicode 代碼點。這些好東西只適用于 UTF-8 編碼的字符串/字節數組。我強烈建議在內部使用 UTF-8。
一個例子:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
println("non-range loop - bytes")
for i := 0; i < len(input); i++ {
fmt.Printf("%d %d %[2]x\n", i, input[i])
}
println("range-loop - runes")
for idx, r := range input {
fmt.Printf("%d %d %[2]c\n", idx, r)
}
println("converted to rune slice")
rs := []rune(input)
fmt.Printf("%#v\n", rs)
}
輸入:X é X
non-range loop - bytes
0 88 58
1 32 20
2 195 c3
3 169 a9
4 32 20
5 88 58
6 10 a
range-loop - runes
0 88 X
1 32
2 233 é
4 32
5 88 X
6 10
converted to rune slice
[]int32{88, 32, 233, 32, 88, 10}

TA貢獻1852條經驗 獲得超1個贊
Unicode 和 utf8 沒有可比性。字符串可以是 unicode 和 utf8。通過閱讀Go 中的字符串、字節、符文和字符,我學到了很多關于這些的東西。
要回答你的問題,
您可以使用包中的DecodeRuneInStringunicode/utf8。
s := "é"
rune, _ := utf8.DecodeRuneInString(s)
fmt.Printf("%x", rune)
什么DecodeRuneInString(s)是,它返回第一個 utf8 編碼字符(符文)s以及該字符寬度(以字節為單位)。因此,如果您想在字符串中獲取每個符文的 unicode 代碼點,請按照以下步驟操作。這是鏈接文檔中給出的示例,僅稍作修改。
str := "Hello, 世界"
for len(str) > 0 {
r, size := utf8.DecodeRuneInString(str)
fmt.Printf("%x %v\n", r, size)
str = str[size:]
}
在操場上試試。
或者,正如 Juergen 指出的那樣,您可以在字符串上使用范圍循環來獲取字符串中包含的符文。
str := "Hello, 世界"
for _, rune := range(str) {
fmt.Printf("%x \n", rune)
}
- 2 回答
- 0 關注
- 191 瀏覽
添加回答
舉報