Golang的utf8.FullRune()函数是否存在问题?
Golang的utf8.FullRune()函数是否存在问题?
在UTF-8编码中,切片 {0xED, 0xCF, 0xCF} 应该是一个无效的编码,但作为 utf8.FullRune 的输入,它却返回了 true。
我想知道哪里出了问题?谢谢!
func main() {
fmt.Println("hello world")
}
3 回复
utf8.FullRune 的文档说明:
FullRune 报告 p 中的字节是否以一个完整的 UTF-8 符文编码开头。无效的编码被视为一个完整的符文,因为它将转换为宽度为 1 的错误符文。
根据你的描述,utf8.FullRune() 函数在处理 {0xED, 0xCF, 0xCF} 这个字节切片时返回 true,这确实是符合预期的行为。utf8.FullRune() 仅检查字节切片是否包含一个完整的 UTF-8 编码序列,而不验证该序列是否是一个有效的 Unicode 码点。
{0xED, 0xCF, 0xCF} 是一个完整的 3 字节 UTF-8 序列(以 0xED 开头),但它在 Unicode 标准中是一个无效的编码(属于 UTF-8 编码中的无效代理区范围)。如果你需要验证有效性,应该使用 utf8.ValidRune() 或 utf8.Valid() 函数。
示例代码:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
data := []byte{0xED, 0xCF, 0xCF}
// 检查是否为完整序列
fmt.Println(utf8.FullRune(data)) // 输出: true
// 检查是否为有效序列
fmt.Println(utf8.Valid(data)) // 输出: false
// 解码并检查单个符文
r, size := utf8.DecodeRune(data)
fmt.Printf("Decoded: %U, size: %d\n", r, size)
fmt.Println(utf8.ValidRune(r)) // 输出: false
}
输出结果:
true
false
Decoded: U+FFFD, size: 3
false
注意:utf8.DecodeRune() 在遇到无效序列时会返回替换字符 U+FFFD。

