15_字符串字节与rune
区分字节长度和字符数量,完成文本与数字的转换。
Go 基础专题 15:字符串、字节与 rune
学习目标:区分字节长度和字符数量,完成文本与数字的转换。
核心知识
Go 的 string 是不可变的字节序列,通常存储 UTF-8 文本,但也可以包含任意字节。len(text) 返回字节数,不是 Unicode 字符数。text[i] 取得第 i 个字节;for _, r := range text 按 UTF-8 解码得到 rune(码点)。显示成一个字形的内容可能含多个码点,因此码点数也不等于用户感知的字数。
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
text := "Go中"
fmt.Println(len(text), utf8.RuneCountInString(text)) // 5 3
for byteIndex, letter := range text {
fmt.Printf("%d %c\n", byteIndex, letter)
}
}
[]byte(text) 得到字节切片,适合 I/O;[]rune(text) 得到码点切片,适合按码点操作。修改后转回字符串会复制数据。字符串拼接少量内容用 +,循环中大量拼接可用 strings.Builder。strconv.Atoi 解析十进制整数并返回错误,strconv.Itoa 生成数字文本。
易错点:不要按单字节切片中文字符串,可能截断 UTF-8 编码。
逐步理解
请分别打印 len("Go中") 与码点数:前者算 UTF-8 字节,后者算解码后的 rune。text[2] 是汉字编码的第一个字节,不能直接当汉字。对用户可见长度的限制更复杂,因为组合字符可能由多个码点组成。跨系统交换文本要明确使用 UTF-8,并在遇到非法字节时决定拒绝还是替换。
动手练习
练习:输出 "你好" 的字节数和码点数。答案:len 为 6,utf8.RuneCountInString 为 2。