Golang 字符串转 []byte 为何有时结果不同?
当使用 []byte(str) 将字符串转换为字节切片时,结果可能与直接声明字节切片不同。
举个例子, 字符 'xa0'(空格字符)在转换为字节切片后,输出的是 [194 129],而直接声明字节切片 [129] 的话,输出的却是 [129]。
这是因为:
- go 中的字符串存储的是 UTF-8 编码的字节切片。
- 字符 'xa0' 的 UTF-8 编码是 [194 129],代表一个宽度为 2 个字节的字符。
因此,当使用 []byte(str) 转换为字节切片时,会直接输出字符的 UTF-8 编码。
而直接声明字节切片,意味着指定了固定长度,此时 go 会根据长度将字节填充到切片中。如果长度不匹配字符的 UTF-8 编码宽度,就会导致结果不同。
要保证转换结果一致,可以使用 []rune(str) 将字符串转换为 rune 切片。rune 切片存储的是字符串中每个字符的 Unicode 码点,不会受到 UTF-8 编码的影响。